Php 使用preg_match查找列表中的所有单词

Php 使用preg_match查找列表中的所有单词,php,preg-match,Php,Preg Match,在SO的帮助下,我能够从电子邮件主题行中提取一个“关键字”作为分类。现在我决定允许每张图片有多个类别,但似乎无法恰当地表达我的问题,以获得谷歌的良好回应。preg_match在列表中的第一个单词处停止。我确信这与“渴望”或简单地用其他东西替换管道符号有关,但我就是看不到。 \b(?:阿姆斯特丹|巴黎|苏黎世|慕尼黑|法兰克福|布尔)\b 我当前使用的整个字符串是: preg_match(“/\b(?:阿姆斯特丹|巴黎|苏黎世|慕尼黑|法兰克福|布尔)\b/i”、“$subject.”、$matc

在SO的帮助下,我能够从电子邮件主题行中提取一个“关键字”作为分类。现在我决定允许每张图片有多个类别,但似乎无法恰当地表达我的问题,以获得谷歌的良好回应。preg_match在列表中的第一个单词处停止。我确信这与“渴望”或简单地用其他东西替换管道符号有关,但我就是看不到。
\b(?:阿姆斯特丹|巴黎|苏黎世|慕尼黑|法兰克福|布尔)\b

我当前使用的整个字符串是:

preg_match(“/\b(?:阿姆斯特丹|巴黎|苏黎世|慕尼黑|法兰克福|布尔)\b/i”、“$subject.”、$matches)

我所需要做的就是把所有这些词都拉出来,如果它们存在的话,而不是停在阿姆斯特丹,或者在它搜索的主题中先出现的任何词。之后,只需处理$matches数组,对吗

谢谢,
标记

好的,下面是一些示例代码,显示了如何删除嵌套:

$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
返回值已经标准化。其概念是让代码返回/创建您需要的数据以供进一步处理。

尝试
preg\u match\u all
-只需将
\u all
添加到函数名中。我还要补充的是,
$matches
会随着
preg\u match\u all
发生一些变化,非常感谢!是的,$匹配确实会改变。乍一看,现在似乎是一个数组中的一个数组<代码>打印($matches)
给我
数组([0]=>Array([0]=>paris[1]=>bulle))
。我正在调查,但有什么明显的建议可以解决这个问题吗?再次感谢@hakre和@datasage的帮助。我不知道它是否“正确”,但我让它与嵌套的foreach循环一起工作。由于
$matches
中的值发生了更改,因此仅添加_all有点短,因为datasage确实正确地提到了这一点。该示例演示如何将结果转换为简单的城市数组。非常感谢您提供的额外帮助!这对我来说很清楚。我知道有一个合适的方法可以做到这一点。