我有以下字符串:cache:search:amsterdam:hotel
我希望preg_match_all
找到单词amsterdam
和hotel
(在本例中)。我做了一些环顾四周并来到了:
preg_match_all( "/(?<=cache:search)(:/w*)/i", "cache:search:amsterdam:hotel", $matches )
我希望得到$匹配的值为amsterdam
和hotel
,但到目前为止我只能得到:amsterdam:hotel
或:amsterdam
尝试。如何在cache:search
之后的括号之间得到所有单词?
答案 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%。这个问题是一个正则表达式,所以这仍然是公认的答案,但我想发布这个替代方案也适用于遇到同样问题的人