preg_match_all查找某个字符串后面的所有单词

时间:2016-05-30 20:47:43

标签: php regex

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

我希望preg_match_all找到单词amsterdamhotel(在本例中)。我做了一些环顾四周并来到了:

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

我希望得到$匹配的值为amsterdamhotel,但到目前为止我只能得到:amsterdam:hotel:amsterdam尝试。如何在cache:search之后的括号之间得到所有单词?

4 个答案:

答案 0 :(得分:3)

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

如果您想直接获取单独的单词,可以使用基于\G的模式:

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

\G匹配上一场比赛后的位置。 (请注意,\G也匹配字符串的开头,这就是我添加(?!\A)的原因。)

答案 1 :(得分:1)

除了家伙的答案,如果你发现它有用,你也可以使用这样的正则表达式:

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

<强> Regex demo

preg_match_all('~(\w+):(\w+)$~', "cache:search:amsterdam:hotel", $matches);

答案 2 :(得分:0)

你可以收集最后两个单词。这应该有效:

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

修改

如果您想要捕获的字数超过两个,我建议改为explode

$str = 'cache:search:amsterdam:hotel';
$matches = explode(':', substr($str, 13));

答案 3 :(得分:0)

没有preg_match的方法就是:

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

我将此与已接受的答案(preg_match_all)进行了比较,执行时间缩短了56%。这个问题是一个正则表达式,所以这仍然是公认的答案,但我想发布这个替代方案也适用于遇到同样问题的人