Php 非常喜欢正则表达式
在字符串中:Php 非常喜欢正则表达式,php,regex,Php,Regex,在字符串中: <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 wid
<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>`
然而,这是行不通的
这里我们有一个类似的情况:
$postproc = preg_replace('#(DisplayText="|\G(?!\A))([^">]*)"(?!\s*>)#', '$1$2"', $postproc);
这将用$quot;
替换DisplayText标记中的所有“引号”。主要区别在于DisplayText标记以一个字符(“)结尾,而上面的字体标记以一系列多个字符结尾,因此我需要一个负数前瞻,而不是简单的[^”>]
否定
我真的试过了。准确地说是八个小时。我被卡住了
$postproc用于包含各种标记的整个文件,其中包括上述多个字体和显示文本标记,每个标记可以包含多个替换项。您可以使用
更妙的是:这个字符串从哪里来?你能操纵它的来源吗?而且,上面提到的答案对嵌套的
FONT
“标记”不起作用。不过这是可行的
$postproc = preg_replace('#(?:\G(?!\A)|<FONT)(?:(?!FONT).)+?\K(?<!&)"#', '$1$2&quot;', $postproc);
$postproc=preg_replace('#)(?:\G(?!\A)| FONT)(?:(?!FONT.)+?\K(?)非常感谢。问题是,这也不起作用。你可以看看你是否在我现在要添加到原始问题的新文本上尝试它。你的代码还获取DisplayText=“blablablablabla”中的""部分,但那些需要保持原样。要处理的代码无法更改:它来自我的客户端仍在使用的非常旧的软件,我无法更改其输出。停止使用正则表达式解析HTML,您将有一个更愉快的时间。相信我。我希望我可以。不幸的是,没有办法解决这一问题,主要是因为这是全部采用PHP不再支持的非常旧的Unicode。
(?:\G(?!\A)|FONT)
(?:(?!FONT).)+?\K
(?<!&)"
(?:\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 &
$postproc = preg_replace('#(?:\G(?!\A)|<FONT)(?:(?!FONT).)+?\K(?<!&)"#', '$1$2&quot;', $postproc);