2015-04-17 3 views
-1

У меня есть следующий текст:Преобразование ".net регулярное выражение" в PHP

<ZZZZ> Av 
<asdd> 122 
<xcxzc> a 
<asas> es& 
<wewa> n 
<zasd> cu 

Это работает в C#, но не в PHP:

(<ZZZZ>\s(.*?)|<YYYY>\s(.*?))\r 

Ближайший я получил, чтобы сделать его работу в PHP был такой:

приращений
(<ZZZZ> (.*)|<YYYY> (.*)) 

Но индекс матч после каждого "или": Regex test link

+2

Что вы пытаетесь достичь? Каков ваш ожидаемый результат? –

+0

Я предполагаю, что причина '\ r'. Используйте '[\ r \ n]'. https://regex101.com/r/uH5hS4/1 и http://regexstorm.net/tester?p=(%3cZZZZ%3e%5cs(.*%3f)%7c%3cYYYY%3e%5cs(.* % 3f))% 5BR% 5cn% 5d & я =% 3cZZZZ% 3e + AV% 0D% 0A% 3casdd% 3e + 122% 0D% 0A% 3cxcxzc% 3e + а% 0D% 0A% 3casas% 3e + ES% 26% 0d% 0a% 3cwewa% 3e + п% 0D% 0A% 3czasd% 3e + Cu. –

+1

Я думаю, вам нужно добавить конец строки anchor '( \ s (. *?) | \ s (. *?)) $', Https://regex101.com/r/dN9xQ0/1 –

ответ

1

Вы не получаете ожидаемый результат, потому что ваш селектор | соответствует номеру матча $2, поэтому вы не получаете правильное значение во втором матче. Но если изменить регулярное выражение, чтобы соответствовать оба варианта в одном регулярном выражении, то вы получите ожидаемый результат:

(<[ZY]{4}>\s(.*)) 

мне пришлось удалить \r в конце строки (можно использовать многострочный флаг для этого) и ? в (.*) блоке (* говорит 0 или много вхождений, поэтому нет необходимости).

fiddle around here Вы можете

Вы должны использовать глобальную (г) модификатор, когда вы хотите, чтобы это пробегать весь текст.

Объяснение Селектор [ZY] будет выбрать либо Z или Y. В {4} состояний, которые вы ожидаете ровно 4 повторений селектора перед тем, так ZZZZ или YYYY. (.*) не нуждается? потому что * уже выбирает none или многие.

+0

'[ZY] {4}' соответствует четырем из 'Z' или' Y' в любой комбинации ('ZZZY',' YZYZ' и т. Д.). Если вы хотите совместить только «YYYY» или «ZZZZ», вам нужно использовать другую группу захвата: '([ZY]) \ 1 {3}' –

Смежные вопросы