PHP генератор регулярных выражений - PullRequest
0 голосов
/ 03 мая 2011

Теперь у меня есть рабочая строка регулярного выражения для следующих необходимых критериев:

регулярное выражение php-ready, состоящее из одной строки, которое включает в себя несколько ключевых слов и ключевых терминов и будет соответствовать хотя бы одному из них.

Например:

Ключевые слова:

  • apple
  • banana
  • strawberry
  • pear cake

Теперь, если какой-либо из этих ключевых терминов найден, он возвращает true. Однако, чтобы добавить немного больше сложности, термин pear cake следует разделить на два ключевых слова, которые должны быть в строке, но не обязательно должны быть вместе.

Пример строк, которые должны возвращать true:

  • A great cake is made from pear
  • i like apples
  • i like apples and bananas
  • i like cakes made from pear and apples
  • I like cakes made from pears

Рабочее регулярное выражение:

/\bapple|\bbanana|\bstrawberry|\bpear.*?\bcake|\bcake.*?\bpear/

Теперь мне нужна функция php, которая создаст это регулярное выражение на лету из массива ключевых слов. Проблема заключается в том, что в этом ключе может быть любое количество ключевых слов. Только один из ключевых слов должен быть найден, но может присутствовать несколько. Как и выше, все слова в ключевом слове должны появляться в строке в любом порядке.

1 Ответ

0 голосов
/ 03 мая 2011

Я написал для вас функцию здесь:

<?php

function permutations($array)
{
 $list = array();
 for ($i=0; $i<=10000; $i++) {
  shuffle($array);
  $tmp = implode(',',$array);
  if (isset($list[$tmp])) {
   $list[$tmp]++;
  } else {
   $list[$tmp] = 1;
  }
 }
 ksort($list);
 $list = array_keys($list);
 return $list;
}



function CreateRegex($array)
{
    $toReturn = '/';
    foreach($array AS $value)
    {
        //Contains spaces
        if(strpos($value, " ") != false)
        {
            $pieces = explode(" ", $value);
            $combos = permutations($pieces);
            foreach($combos AS $currentCombo)
            {
                $currentPieces = explode(',', $currentCombo);
                foreach($currentPieces AS $finallyGotIt)
                {
                    $toReturn .= '\b' . $finallyGotIt . '.*?';
                }
                $toReturn = substr($toReturn, 0, -3) . '|';
            }
        }
        else
        {
            $toReturn .= '\b' . $value . '|';
        }
    }

    $toReturn = substr($toReturn, 0, -1) . '/';
    return $toReturn;
}




var_dump(CreateRegex(array('apple', 'banana', 'strawberry', 'pear cake')));

?>

Я получил функцию перестановок из:

http://www.hashbangcode.com/blog/getting-all-permutations-array-php-74.html

Но я бы порекомендовал найтилучше функционировать и использовать другой, так как на первый взгляд он довольно уродливый, так как он увеличивает $ i до 10000 независимо от того, что.

Кроме того, вот кодовая панель для кода:

http://codepad.org/nUhFwKz1

Дайте мне знать, если с ним что-то не так!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...