非常依赖RegEx

时间:2018-10-15 16:56:56

标签: php regex

在字符串中:

<ut Type="start" Style="external" RightEdge="angle" DisplayText="P id=&quot;2&quot;">&lt;tr&gt;&lt;td width="10%" bgcolor="#C0C0C0" valign="top"&gt;&lt;p align="right"&gt;2&lt;/td&gt;&lt;td width="90%"&gt;</ut><Tu MatchPercent="100"><Tuv Lang="EN-US"><ut Type="start" RightEdge="angle" DisplayText="csf style=&quot;Italic CH&quot; italic=&quot;on&quot;">&lt;!-- 1 --&gt;&lt;FONT COLOR="#FF0000"&gt;&amp;lt;csf style=&quot;Italic CH&quot; italic=&quot;on&quot;&amp;gt;&lt;/FONT&gt;</ut>Battlefield™ V<ut Type="end" LeftEdge="angle" DisplayText="1">&lt;!-- 1 --&gt;&lt;FONT COLOR="#FF0000"&gt;&amp;lt;/1&amp;gt;&lt;/FONT&gt;</ut> (Xbox One)</Tuv><Tuv Lang="NL-NL"><ut Type="start" RightEdge="angle" DisplayText="csf style=&quot;Italic CH&quot; italic=&quot;on&quot;">&lt;!-- 1 --&gt;&lt;FONT COLOR="#FF0000"&gt;&amp;lt;csf style=&quot;Italic CH&quot; italic=&quot;on&quot;&amp;gt;&lt;/FONT&gt;</ut>Battlefield™ V<ut Type="end" LeftEdge="angle" DisplayText="1">&lt;!-- 1 --&gt;&lt;FONT COLOR="#FF0000"&gt;&amp;lt;/1&amp;gt;&lt;/FONT&gt;</ut> (Xbox One)</Tuv></Tu><ut Type="end" Style="external" LeftEdge="angle" DisplayText="P">&lt;/td&gt;&lt;/tr&gt;</ut>`

我想用&quot;替换&amp;quot;

仅在字符串被FONT标签包围的情况下才会发生这种情况。

我正在使用PHP:

$postproc = preg_replace('#(FONT|\G(?!\A))((?!/FONT).*?)&quot;(?!/FONT)#', '$1$2&amp;quot;', $postproc);

但是这不起作用。

这里我们有类似的情况:

$postproc = preg_replace('#(DisplayText="|\G(?!\A))([^">]*)"(?!\s*>)#', '$1$2&quot;', $postproc);

这用$quot;替换了DisplayText标记内的所有“引号,主要区别在于DisplayText标记以一个字符(”)结尾,而上述FONT标记以一系列多个字符结尾,因此我需要否定的前瞻,而不是简单的[^">]否定。

我真的尝试过。精确地说,要八个小时。我被卡住了。

$ postproc用于包含各种标签的整个文件,其中包括如上所述的多个FONT和DisplayText标签,并且每个标签可以包含多个替换。

2 个答案:

答案 0 :(得分:1)

可以使用

(?:\G(?!\A)|FONT)
(?:(?!FONT).)+?\K
(?<!&amp;)&quot;

需要用&amp;&quot;代替,请参见a demo on regex101.com


细分为:

(?:\G(?!\A)|FONT) # match FONT or at the end of the last match
(?:(?!FONT).)+?\K # match everything that comes lazily
                  # do not overrun FONT, forget what has been matched
                  # thus far (\K)
(?<!&amp;)&quot;  # match &quot; only when it is not preceeded by &amp;


更好的是:该字符串从何而来?你能操纵原点吗?另外,上述答案不适用于嵌套的FONT“标签”。

答案 1 :(得分:0)

这有效!

$postproc = preg_replace('#(?:\G(?!\A)|&lt;FONT)(?:(?!FONT).)+?\K(?<!&amp;)&quot;#', '$1$2&amp;quot;', $postproc);

第一个非捕获组中的多余&lt;可以解决问题。