Использование preg_match для поиска всех слов в списке

С помощью 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);

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

Спасибо, Марк

Итак, вот пример кода с 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 matches уже нормализовано. Концепция заключается в том, чтобы вернуть код / ​​создать данные так, как вам нужно для дальнейшей обработки.