我有一个PHP脚本,我需要匹配特定字符串的最后一次出现。
假设我有以下几种情况:
<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 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 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 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>
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...
。
答案 0 :(得分:2)
您的正则表达式可以。您可以在正则表达式之前添加以下内容:
\A.*\K
\A
断言输入字符串的开头.*
立即匹配整个输入字符串,然后尝试回溯以匹配下一个模式Este
\K
将输出重置到该点,这样您将仅看到所需的字符串我删除了前瞻,并使您的正则表达式更简单。总而言之,我们拥有以下优势:
\A.*\KEste.+?texto.+?n.+?o.+?substitui.+?o.+?publicado