Регулярное выражение с отрицательным взглядом и точка соответствует модификатору новой строки (/ s) - PullRequest
0 голосов
/ 31 мая 2019

У меня есть скрипт PHP, и мне нужно соответствовать последнему вхождению определенной строки.

Допустим, у меня есть следующие сценарии:

1

<p class="TPTexto" style="text-autospace: none; ">
<font face="Arial" size="2" color="#FF0000">Este texto não substitui o publicado no DOU de  28.9.2006.</font>
</p>

2

Este texto abc def
<p class="TPTexto" style="text-autospace: none; ">
<font face="Arial" size="2" color="#FF0000">Este texto não substitui o publicado no DOU de  28.9.2006.</font>
</p>

3

Este texto abc def
<p class="TPTexto" style="text-autospace: none; ">
<font face="Arial" size="2" color="#FF0000">Este 
texto não substitui o publicado no DOU de  28.9.2006.</font>
</p>

4

Este texto abc def
<p class="TPTexto" style="text-autospace: none; ">
<font face="Arial" size="2" color="#FF0000">Este <font></font>
texto não substitui o publicado no DOU de  28.9.2006.</font>
</p>

5

Este texto abc def
<p class="TPTexto" style="text-autospace: none; ">
<font face="Arial" size="2" color="#FF0000">Este            texto não substitui     o     publicado no DOU de  28.9.2006.</font>
</p>

Я хочу совпадать с Este texto não substitui o publicado во всех случаях, принимая временные помехи, например Este <font></font>\ntexto não substitui o publicado.

Итак, я пошел со следующим регулярным выражением:
/Este(?:.(?!Este))+?texto.+?n.+?o.+?substitui.+?o.+?publicado/uis

Флаги:
u для приема символов Юникода
i принять нечувствительный контент
s чтобы точка (.) соответствовала символам новой строки (так что мой негативный взгляд работает)

Таким образом, я будет соответствовать последнему Este и следующему тексту, как я хочу, верно? Нету! Модификатор s убивает его.
(я использую этот инструмент PHP , чтобы проверить его кстати)

Я не знаю, почему модификатор s убивает его в этом случае. Любая помощь будет принята с благодарностью.


Я использую PHP preg_match_all в этом проекте.

Редактировать

Заметил, что не ясно: мне нужен ВТОРОЙ Este texto... не первый.

1 Ответ

2 голосов
/ 31 мая 2019

Ваше регулярное выражение в порядке.Вы можете просто добавить к своему регулярному выражению следующее:

\A.*\K
  • \A подтверждает начало входной строки
  • .* соответствует всей входной строке сразу, а затем пытается вернуться назад для соответствияследующий шаблон Este
  • \K сбрасывает вывод до той точки, чтобы вы могли видеть только желаемую строку

Я удалил lookahead и сделал ваше регулярное выражениенемного прощеСобирая все вместе, мы имеем это:

\A.*\KEste.+?texto.+?n.+?o.+?substitui.+?o.+?publicado
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...