Использование preg_match, чтобы найти все слова в списке - PullRequest
6 голосов
/ 15 июня 2011

С помощью SO я смог вытащить «ключевое слово» из строки темы электронного письма для использования в качестве категории. Теперь я решил разрешить несколько категорий для одного изображения, но не могу правильно сформулировать свой вопрос, чтобы получить хороший ответ от Google. preg_match останавливается на первом слове в списке. Я уверен, что это как-то связано с тем, чтобы быть «нетерпеливым» или просто заменять символ трубы | чем-то другим, но я просто не вижу этого.
\b(?:amsterdam|paris|zurich|munich|frankfurt|bulle)\b.

Вся строка, которую я сейчас использую:

preg_match("/\b(?:amsterdam|paris|zurich|munich|frankfurt|bulle)\b/i", "." . $subject . ".", $matches);

Все, что мне нужно сделать, это вытащить все эти слова, если они присутствуют, в отличие от остановки в Амстердаме или любого другого слова, которое стоит первым в предмете, который он ищет. После этого это просто вопрос работы с массивом $ match, верно?

Спасибо, Mark

1 Ответ

1 голос
/ 15 июня 2011

Хорошо, вот пример кода с preg_match_all(), который также показывает, как удалить вложение:

$pattern = '\b(?:amsterdam|paris|zurich|munich|frankfurt|bulle)\b';
$result = preg_match_all($pattern, $subject, $matches);

# Check for errors in the pattern
if (false === $result) {
    throw new Exception(sprintf('Regular Expression failed: %s.', $pattern));
}

# Get the result, for your pattern that's the first element of $matches
$foundCities = $result ? $matches[0] : array();

printf("Found %d city/cities: %s.\n", count($foundCitites), implode('; ', $foundCities));

Поскольку $foundCities теперь является простым массивом, вы можете итерировать его напрямую:

foreach($foundCities as $index => $city) {
    echo $index, '. : ', $city, "\n";
}

Нет необходимости во вложенном цикле, поскольку возвращаемое значение $matches уже нормализовано. Идея состоит в том, чтобы заставить код возвращать / создавать данные так, как вам нужно для дальнейшей обработки.

...