繁体   English   中英

Preg_replace() 使用非捕获组添加到字符串

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM