在字符串中:
<ut Type="start" Style="external" RightEdge="angle" DisplayText="P id="2""><tr><td width="10%" bgcolor="#C0C0C0" valign="top"><p align="right">2</td><td width="90%"></ut><Tu MatchPercent="100"><Tuv Lang="EN-US"><ut Type="start" RightEdge="angle" DisplayText="csf style="Italic CH" italic="on""><!-- 1 --><FONT COLOR="#FF0000">&lt;csf style="Italic CH" italic="on"&gt;</FONT></ut>Battlefield™ V<ut Type="end" LeftEdge="angle" DisplayText="1"><!-- 1 --><FONT COLOR="#FF0000">&lt;/1&gt;</FONT></ut> (Xbox One)</Tuv><Tuv Lang="NL-NL"><ut Type="start" RightEdge="angle" DisplayText="csf style="Italic CH" italic="on""><!-- 1 --><FONT COLOR="#FF0000">&lt;csf style="Italic CH" italic="on"&gt;</FONT></ut>Battlefield™ V<ut Type="end" LeftEdge="angle" DisplayText="1"><!-- 1 --><FONT COLOR="#FF0000">&lt;/1&gt;</FONT></ut> (Xbox One)</Tuv></Tu><ut Type="end" Style="external" LeftEdge="angle" DisplayText="P"></td></tr></ut>`
我想用"
替换&quot;
仅在字符串被FONT标签包围的情况下才会发生这种情况。
我正在使用PHP:
$postproc = preg_replace('#(FONT|\G(?!\A))((?!/FONT).*?)"(?!/FONT)#', '$1$2&quot;', $postproc);
但是这不起作用。
这里我们有类似的情况:
$postproc = preg_replace('#(DisplayText="|\G(?!\A))([^">]*)"(?!\s*>)#', '$1$2"', $postproc);
这用$quot;
替换了DisplayText标记内的所有“引号,主要区别在于DisplayText标记以一个字符(”)结尾,而上述FONT标记以一系列多个字符结尾,因此我需要否定的前瞻,而不是简单的[^">]
否定。
我真的尝试过。精确地说,要八个小时。我被卡住了。
$ postproc用于包含各种标签的整个文件,其中包括如上所述的多个FONT和DisplayText标签,并且每个标签可以包含多个替换。
答案 0 :(得分:1)
您可以使用
(?:\G(?!\A)|FONT)
(?:(?!FONT).)+?\K
(?<!&)"
需要用&"
代替,请参见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)
(?<!&)" # match " only when it is not preceeded by &
FONT
“标签”。
答案 1 :(得分:0)
这有效!
$postproc = preg_replace('#(?:\G(?!\A)|<FONT)(?:(?!FONT).)+?\K(?<!&)"#', '$1$2&quot;', $postproc);
第一个非捕获组中的多余<
可以解决问题。