php - 非常坚持正则表达式
问题描述
在字符串中:
<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);
这将 DisplayText 标记内的所有 " 引号替换为$quot;
主要区别在于 DisplayText 标记以一个字符 (") 结尾,而上面的 FONT 标记以一系列多个字符结尾,所以我需要一个否定的前瞻而不是简单的[^">]
否定.
我真的试过了。准确地说是八小时。我被困住了。
$postproc 用于包含各种标签的整个文件,其中包括上面提到的多个 FONT 和 DisplayText 标签,每个标签可以包含多个替换。
解决方案
你可以使用
(?:\G(?!\A)|FONT)
(?:(?!FONT).)+?\K
(?<!&)"
需要替换为&"
,请参阅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
“标签”。
推荐阅读
- c# - C#表单类事件
- python - 使用递归找到大小为 k 的平衡代码
- c - 为什么我不能编译这段代码并且我得到分段错误:C 代码中的 11
- node.js - 使用 NodeJS 部署一个反应应用程序并表达到 Heroku
- sql - 将一个表中的列值连接到另一个表的新列中的行
- python-3.x - 如何在 tkinter 中设置字体大小
- wpf - 使用 ReactiveUI 和 WPF 重新加载图像
- javascript - 无法读取未定义的属性“移动”-Vue/Vuetify/Storybook
- r - 无法打开文件'test.csv':没有这样的文件或目录文件中的错误(文件,“rt”):无法打开连接
- javascript - 使用 Spring Security 时出现意外的 403 错误