[英]Preg_replace() to add to string using non-capturing group
我有一段 HTML 标记,我需要为其添加特定的 CSS 规则。 HTML是这样的:
<tr>
<td style="color:#555555;padding-top: 3px;padding-bottom: 20px;">In order to stop receiving similar emails, simply remove the relevant <a href="https://domain.tld/dashboard/" target="_blank">saved search</a> from your account.</td>
</tr>
如您所见, td
已经包含一个style
标签,所以我的想法是匹配最后一个;
并将其替换为;
加上我需要添加的规则......
问题是,虽然我使用了适当的非捕获组,但我仍然无法弄清楚如何正确地做到这一点......请看一下这个实验: https ://regex101.com/r/qlVq6A/ 1
(<td.*style=".*)(;)(".*>)(?:In order to stop receiving)
另一方面,当我为最后一部分分配一个捕获组时(那里的英文文本只是为了识别我感兴趣的td
)它工作正常,但我觉得这是一种间接的方式来完成这项工作...看看这个实验: https ://regex101.com/r/qhVatN/1
(<td.*style=".*)(;)(".*>In order to stop receiving)
有人可以向我解释为什么第一条路线不起作用吗? 基本上,为什么非捕获组仍然捕获其中的文本......
在您的第二个模式中,您使用 3 个捕获组并使用要在替换中添加的样式,并且第 3 组包含In order to stop receiving
,在替换中使用第 3 组后将出现该样式。
但是在您的第一个模式中,您使用了一个非捕获组(?:
这将匹配但不是替换的一部分。
请注意,当使用这样的非捕获组时,您可以完全省略它,因为像这样的分组本身没有例如量词或交替没有其他目的。
您可以对示例字符串使用模式,但这很容易出错,使用 DOM 解析器会是更好的选择。
一种仅使用 2 个捕获组来编写模式的方法:
(<td[^>]*\bstyle="[^"]*;)([^"]*">In order to stop receiving)
在更换使用中:
$1font-size: 80%;$2
解释
(
捕获组 1
<td[^>]*
匹配<td
,然后可选地重复除>
之外的任何字符\bstyle="[^"]*;
匹配style="
然后可选地重复匹配除"
之外的任何字符,然后匹配最后一个分号(注意它现在是第 1 组的一部分))
关闭第 1 组(
捕获组 2
[^"]*">In order to stop receiving
可选地重复匹配除:
之外的任何字符,然后匹配">
后跟预期的文本)
关闭第 2 组查看正则表达式演示。
编写模式而不使用捕获组的另一种选择,使用\K
忘记到目前为止匹配的内容,以及积极的前瞻(?=
将预期的文本断言到右侧:
<td[^>]*\bstyle="[^"]*;\K(?=[^"]*">In order to stop receiving)
查看另一个正则表达式演示。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.