preg_match необязательные элементы в строке - PullRequest
0 голосов
/ 27 мая 2011

У меня есть две строки, которые содержат до 3 элементов:

1) anychar[price]{alphanum} e.g. a1\')[=00.00]{a1234}
2) anychar:anychar{alphanum} e.g. a1\'):a2\'){a1234}

... но элемент {} является необязательным и может не всегда присутствовать.Я написал следующие шаблоны (соответственно):

1) /(.+)\[(.+)\]\{*(\w+)*\}*/ - работает как положено

2) /(.+)\:(.+)\{*(\w+)*\}*/ - работает нормально, если удален элемент {}, но не с ним.

Массив результатов для 2 выглядит следующим образом:

( [0] => a1\'):a2\'){a123} [1] => a1\') [2] => a2\'){a123} )

Я пробовал несколько различных перестановок из вышеприведенного, но без кубиков.Есть идеи?

1 Ответ

1 голос
/ 27 мая 2011

Сначала вы должны удалить * после {,} и (\ w +).

'/(.+)\:(.+)\{(\w+)\}/'

Дает

array(4) {
  [0]=>
  string(18) "a1\'):a2\'){a1234}"
  [1]=>
  string(5) "a1\')"
  [2]=>
  string(5) "a2\')"
  [3]=>
  string(5) "a1234"
}

* означает 0, 1 или несколько, и PCRE пытаетсячтобы найти самый быстрый маршрут, который он может сделать, поэтому, если вы сделаете всю третью часть необязательной (используя * везде), тогда самый быстрый путь - это включить все во вторую группу и пропустить третью, поэтому ваш код не работает.

Теперь, чтобы разобраться с тем фактом, что третья часть является необязательной, вы должны использовать позитивный взгляд: во второй группе вы попросите pcre выбрать его, только если он может соответствовать другому регулярному выражению после него.,Последнее регулярное выражение таково:

'/(.+)\:(.+(?=(?:(?<=[^}])$|\{(\w+)\})))/'

То, что я изменил, таково:

  • во второй группе, я добавил положительный взгляд в форму (? = Regex).Как сказано, это означает, что оно должно совпадать.Lookahead не являются выборочными по умолчанию, это означает, что они не создают запись в вашем конечном результате / они не возвращаются вам.

  • внутри этого lookahead, я создал два случая,это означает, что для сопоставления. + из второй группы должен соответствовать любому случаю моего просмотра.

  • Первый случай очень простой, это означает, что конец строки неперед ним} будет соответствовать строка, когда 3-й части нет

  • во втором случае, если вы выбираете 3-ю группу, мы делаем ее выбираемой так, чтобы она была возвращенав результатах, если присутствует

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...