首页 > 解决方案 > 非常坚持正则表达式

问题描述

在字符串中:

<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);

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

我真的试过了。准确地说是八小时。我被困住了。

$postproc 用于包含各种标签的整个文件,其中包括上面提到的多个 FONT 和 DisplayText 标签,每个标签可以包含多个替换。

标签: phpregex

解决方案


可以使用

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

需要替换为&amp;&quot;,请参阅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“标签”。


推荐阅读