正负号为负的正则表达式和点匹配换行符(/ s)

时间:2019-05-30 22:31:41

标签: php regex regex-lookarounds regex-negation regex-group

我有一个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接受Unicode字符
i接受不敏感的内容
s使点(.)与换行符匹配(因此,我的否定超前有效)

这样,我根据需要匹配最后一个Este和以下文本,对吗?不! s修饰符会杀死它。
(我正在使用this PHP tool对其进行测试)

我不知道为什么在这种情况下s修饰符会杀死它。任何帮助将不胜感激。


我在此项目上使用的是PHP的preg_match_all

修改

说不清楚,我不需要第二个Este texto...

1 个答案:

答案 0 :(得分:2)

您的正则表达式可以。您可以在正则表达式之前添加以下内容:

\A.*\K
  • \A断言输入字符串的开头
  • .*立即匹配整个输入字符串,然后尝试回溯以匹配下一个模式Este
  • \K将输出重置到该点,这样您将仅看到所需的字符串

我删除了前瞻,并使您的正则表达式更简单。总而言之,我们拥有以下优势:

\A.*\KEste.+?texto.+?n.+?o.+?substitui.+?o.+?publicado