Справка по PHP Regex - использование более близкого слова из списка в качестве границы вместо заданного в списке порядка - PullRequest
0 голосов
/ 27 декабря 2011

У меня проблема с одним выражением регулярного выражения, поэтому входная строка выглядит как

hello world and me or you

и я хотел бы сопоставить все от привет до ближайшего / ближайшего из шумных слов: and,or

до сих пор я придумал что-то вроде этого:

preg_match_all("/^hello[A-Z0-9 -]*(or|and)/is",$string,$match);

но проблема в том, что он вернется: hello world and me or вместо hello world and, поскольку or является первым в (or|and) список.

Было бы очень признательно, если бы кто-нибудь мог сказать мне, есть ли возможность сообщить движку регулярных выражений, чтобы он проверял, какой из них ближе или ближе к списку токенов ИЛИ для сопоставления, и использовал этот вместо проверки порядка, как указано, то есть * 1020. * в этом случае и следует использовать его ближе к исходному шаблону.

P.S. изменение порядка внутри (or|and) не является решением, так как есть больше слов, и вы никогда не знаете, какое из них ближе, поэтому это нужно сделать на алгоритмическом уровне.

большое спасибо за ваши советы.

Ответы [ 2 ]

2 голосов
/ 27 декабря 2011

Знак вопроса после звездочки (т. Е. /.*?/) говорит, что выражение со звездочкой не является жадным.Таким образом, ваш RegExp должен быть /^hello[A-Z0-9 -]*?(or|and)/is или что-то подобное.

0 голосов
/ 27 декабря 2011

Использовать (захват) подшаблонов :

preg_match_all("/^(hello[A-Z0-9 -]*)(or|and)/is",$string,$match);

и $match[0][1], $match[1][1], $match[2][1] ... будут содержать нужные вам значения.

...