regex — php preg_grep не работает, когда заданное регулярное выражение имеет пробел между подходящим словом

Я пытаюсь сопоставить слово со списком имен тегов в массиве, используя preg_grep

$tagOptArray = array("Corporate", "Exporters", "Buyers", "News", "Apparel","Aquarium Fish", "Boat and Ship Building");
$subBlockTag = "Boat";

$tag = preg_grep('/' . $subBlockTag . '[.]*/i', $tagOptArray);

var_dump($tag);

это приводит к следующему результату.

array(1) { [6]=> string(22) "Boat and Ship Building" }

Но когда $subBlockTag = "Boat Building"; это возвращает пустой массив, который не ожидается, так как он должен совпадать с «Boat and Ship Building» в массиве тегов.

РЕДАКТИРОВАТЬ

Ниже приведены возможные теги, которые могут быть назначены для $subBlockTag

$subBlockTag = "Boat Building";
$subBlockTag = "Ornamental Fish";
$subBlockTag = "Fish";
$subBlockTag = "Fruits and Vegetables";
$subBlockTag = "Diamond and Jewellery";

1

Решение

Если у вас есть обычные слова, разделенные пробелами в $tagOptArray и вам нужно сопоставить элементы, содержащие слова в том же порядке, вы можете заменить все пробелы на .* и используйте ваш подход:

$tagOptArray = array("Corporate", "Exporters", "Buyers", "News", "Apparel","Aquarium Fish", "Boat and Ship Building");
$subBlockTag = "Boat Building";
$tag = preg_grep('/' .  preg_replace("~\s+~", ".*", trim($subBlockTag)) . '/is', $tagOptArray);
print_r($tag);

Увидеть PHP демо.

Я предлагаю также использовать trim($subBlockTag) чтобы избежать .* на лидирующих / трейлинг-позициях, особенно на лидирующих позициях, чтобы избежать проблем с производительностью. Это может быть медленно, если у вас есть очень длинные тексты для обработки.

Чтобы найти совпадение, когда в строке присутствуют все слова, разделенные пробелами, вам нужно создать регулярное выражение с положительными подсказками в начале:

$tagOptArray = array("Corporate", "Exporters", "Buyers", "News", "Apparel","Aquarium Fish", "Boat and Ship Building");
$subBlockTag = "building boat";
$tag = preg_grep('/^(?=.*' .  implode(")(?=.*", preg_split("~\s+~", trim($subBlockTag))) . ')/is', $tagOptArray);
print_r($tag);

Увидеть еще одна демонстрация PHP, и вот regex demo.

0

Другие решения

Присоединяйтесь к тегам с помощью регулярного выражения ИЛИ символа |

$tagOptArray = array("Corporate", "Exporters", "Buyers", "News", "Apparel","Aquarium Fish", "Boat and Ship Building","boat");
$subBlockTag = "Building   Boat";
$tag = preg_grep('/' . preg_replace("~\s+~", "|",$subBlockTag) . '/is', $tagOptArray);
print_r($tag);

Выход:

Array
(
[6] => Boat and Ship Building
[7] => boat
)
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector