正则表达式:最短的路径不受尊重

时间:2011-12-19 14:22:54

标签: php regex preg-match-all

我想解析这样的事情:

{{word1|word2|word3|word4|...}}
{{word1|word2|word3}}
...

preg_match_all。 我只需要3个第一个单词,所以我制作了这个正则表达式:

/\{\{(.*)\|(.*)\|(.*)[\|.*]?\}\}/Uim

但是当有4个或更多单词时,第三个捕获组需要word3|word4|...

我希望U修饰符采用最短路径,所以我不知道我在这里做错了什么。有人能帮帮我吗?

3 个答案:

答案 0 :(得分:3)

一种可能性:

\{\{([^|]*)\|([^|]*)\|([^|]*)(?:\||\}\})

说明:

\{\{          # Two of {{ 
([^|]*)       # Any characters until '|'
\|            # Character '|'
([^|]*)       # Any characters until '|'
\|            # Character '|'
([^|]*)       # Any characters until '|'
(?:\||\}\})   # A vertical bar, or two }}, without grouping.

答案 1 :(得分:2)

试试这个:

/^\{\{([^|]+)\|([^|]+)\|([^|]+)/im

.*也需要|,因此它与word1|word2...匹配

修改

更好的版本:

preg_match_all('/^{{([^|}]+)\|([^|}]+)\|([^|}]+)/m', "{{word1|word2|word3|word4|...}}\n{{word5|word6|word7}}", $matches, PREG_SET_ORDER);
var_dump($matches)

答案 2 :(得分:1)

在这里试试

/\{\{([^|]*)\|([^|]*)\|([^|]*).*\}\}/

here on Regexr

由于您不搜索字母,因此您不需要修饰符i,也不需要锚点^$,因此不需要修饰符m。我在这里使用的[^|]设计不合适,所以不需要U