Регулярное выражение: кратчайший путь не соблюдается - PullRequest
0 голосов
/ 19 декабря 2011

Я хочу разобрать что-то вроде этого:

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

с preg_match_all. Мне просто нужно 3 первых слова, поэтому я сделал это регулярное выражение:

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

Но когда есть 4 слова или больше, третья группа захвата берет word3|word4|...

Я ожидал, что модификатор U выберет кратчайший путь, поэтому я не знаю, что я делаю здесь неправильно. Может кто-нибудь помочь мне, пожалуйста?

Ответы [ 3 ]

3 голосов
/ 19 декабря 2011

Одна возможность:

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

Объяснение:

\{\{          # Two of {{ 
([^|]*)       # Any characters until '|'
\|            # Character '|'
([^|]*)       # Any characters until '|'
\|            # Character '|'
([^|]*)       # Any characters until '|'
(?:\||\}\})   # A vertical bar, or two }}, without grouping.
2 голосов
/ 19 декабря 2011

Попробуйте это:

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

.* тоже принимает |, поэтому оно соответствует word1|word2...

редактирование:

лучшая версия:

preg_match_all('/^{{([^|}]+)\|([^|}]+)\|([^|}]+)/m', "{{word1|word2|word3|word4|...}}\n{{word5|word6|word7}}", $matches, PREG_SET_ORDER);
var_dump($matches)
1 голос
/ 19 декабря 2011

Попробуйте здесь

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

Посмотрите здесь на Regexr

Поскольку вы не ищете буквы, значит, вам не нужен модификатор i, без якорей ^ или $, поэтому модификатор m не требуется.Я использовал здесь [^|], что неприлично по дизайну, поэтому U не требуется.

...