Теперь у меня есть рабочая строка регулярного выражения для следующих необходимых критериев:
однострочное регулярное выражение, содержащее несколько ключевых слов, и keyterms и будет соответствовать хотя бы одному из них.
- Как выполнить регулярное выражение URL для структуры маршрутизации?
- Regex для имен со специальными символами (Unicode)
- Регулярное выражение для частичного извлечения php-кода ((определение массива))
- Regex приводит к тому, что «Разделитель не должен быть буквенно-цифровым или обратным слэшем»
- PHP разделяет строку на целочисленный элемент и строку
Например:
Ключевые термины:
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, которая будет создавать это регулярное выражение «на лету» из массива keyterms. Наклейка заключается в том, что keyterm может содержать любое количество ключевых слов внутри этого ключа. Нужно только найти ключ, но может присутствовать несколько. Как и прежде, слова в ключевом ключе должны появляться в строке в любом порядке.
Я написал для вас функцию здесь:
<?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 независимо от того, что.
Кроме того, здесь приведен код для кода:
Дайте мне знать, если с этим что-то не так!