Php preg_match_all查找特定字符串后面的所有单词

Php preg_match_all查找特定字符串后面的所有单词,php,regex,Php,Regex,我有以下字符串:cache:search:amsterdam:hotel 我想做一个preg_match_all,在这个例子中找到单词amsterdam和hotel。我环顾四周,得出以下结论: preg_match_all( "/(?<=cache:search)(:/w*)/i", "cache:search:amsterdam:hotel", $matches ) 我希望得到$matches,以获得阿姆斯特丹和酒店的价值,但到目前为止,我在各种尝试中只能得到:阿姆斯特丹:酒店或只是:

我有以下字符串:cache:search:amsterdam:hotel

我想做一个preg_match_all,在这个例子中找到单词amsterdam和hotel。我环顾四周,得出以下结论:

preg_match_all( "/(?<=cache:search)(:/w*)/i", "cache:search:amsterdam:hotel", $matches )

我希望得到$matches,以获得阿姆斯特丹和酒店的价值,但到目前为止,我在各种尝试中只能得到:阿姆斯特丹:酒店或只是:阿姆斯特丹。如何获取cache:search后括号中的所有单词?

首先,提取:amsterdam:hotel后,您可以轻松拆分字符串

如果要直接获取分隔的单词,可以使用基于\G的模式:

preg_match_all('~(?:\G(?!\A)|cache:search):\K[^:]+~', $subject, $matches);

其中\G匹配上一次匹配后的位置。注意\G也匹配字符串的开头,这就是我添加的原因\你只需要收集最后两个单词。这应该起作用:

preg_match_all( "/(\w+):(\w+)$/i", "cache:search:amsterdam:hotel", $matches )
编辑:

如果您想捕获两个以上的单词,我建议使用explode:


除此之外,如果您觉得有用,还可以使用如下正则表达式:

(\w+):(\w+)$

在不进行预匹配的情况下,可以这样做:

$matches = array_splice( ( explode( ':', 'cache:search:amsterdam:hotel' ) ), 2 );

我将此与公认的答案preg_match_all进行了比较,这需要56%的时间来执行。这个问题是一个regexp,所以这仍然是公认的答案,但我想为遇到相同问题的人发布这个备选方案

怎么样:[\w::+然后用冒号分解第一个捕获组?!韦斯顿,这与最后3个词“搜索”、“阿姆斯特丹”和“酒店”匹配。我知道我可以切碎这个数组,但我正在将“cache:search”之后的所有内容作为单独的单词进行查找……现在,应该只取最后两个单词!Weston,虽然这确实是给定示例的解决方案,但它只是一个示例。我不知道前两个单词后面有多少个单词,有趣的解决方案。。。我会检查它在赛前的表现这是目前为止最快的方式,但我不太喜欢固定的'13',因此,这也需要一些数学运算,这使得它的性能与其他地方的array_拼接方法相同page@patrick如果第一个字始终是“cache”,并且只有第二个字的长度发生了变化,那么用这个字替换13,它将比调用array_strpos$str“:”,6+1更快。干杯如果您已经知道缓存后面有两个词:search:,那么这确实是一个更简单的解决方案。您还可以使用带格式的字符串:sscanf$str,'cache:search:%[^::::%[^:][^:'Hey@casimirithippolyte,向您学习总是一件愉快的事情。是的,我把答案放在这里只是为了以防万一。
preg_match_all('~(\w+):(\w+)$~', "cache:search:amsterdam:hotel", $matches);
$matches = array_splice( ( explode( ':', 'cache:search:amsterdam:hotel' ) ), 2 );