如何使用 PHP 替换所有标题属性中的单词

How to Replace Words in all the Title Attributes using PHP

我四处搜索,只找到了不符合我以下需求的替换选项。

然而,我找到的最接近的是:

preg_replace('/<a(.*)title="([^"]*)"(.*)>/','chocolate chip cookies',$items);

我认为这个问题的答案也可以帮助其他有类似需求的人。

简单地说,如果可能的话,我想在一个语句中全局替换所有标题属性 (title="") 中的特定单词和其他单词。 这应该适用于 hyperlink 和图像标题属性。

例如: 我会更改单词“chocolate”、“chocolate cookies”和“chocolate vanilla cookies[=48=” ]”到所有标题属性中的“巧克力饼干”,如下例所示。

但是,我不想在 URL 或 link 的文本中更改单词“chocolate”。

总共有 50 个项目列表,其中有 50 个单独的 hyperlinks,全部放在一个数组中。因此,替换代码最好能在一条语句中替换整个数组中的单词。

注意:如果例3太难,那么例1和例2的答案就足够了。

示例 1:

<a class="dessert" href="http://mywebsite.com/chocolate.php" title="Try out our new chocolate">chocolate</a>

示例 2:

<a class="dessert" href="http://mywebsite.com/chocolate.php" title="Try out our new chocolate cookies">chocolate</a>

示例 3:

<a class="dessert" href="http://mywebsite.com/chocolate.php" title="Try out our new chocolate vanilla cookies">chocolate</a>

期望的结果:

<a class="dessert" href="http://mywebsite.com/chocolate.php" title="Try out our new chocolate chip cookies">chocolate</a>

谢谢。

例如,您可以使用 DomDocumentgetElementsByTagName 来查找元素并使用模式测试 title 属性的值:

\bchocolate(?:(?:\hvanilla)?\hcookies)?\b 

说明

  • \b 字边界
  • chocolate字面匹配
  • (?:非捕获组
    • (?:\hvanilla)? 可选择匹配水平空白字符和 vanilla
    • \hcookies 匹配水平空白字符和 cookies
  • )? 关闭组并使其可选
  • \b 字边界

Regex demo | Php demo

如果模式匹配,则可以设置新标题。

$html = <<<HTML
<a class="dessert" href="http://mywebsite.com/chocolate.php" title="Try out our new chocolate">chocolate</a>
<a class="dessert" href="http://mywebsite.com/chocolate.php" title="Try out our new chocolate cookies">chocolate</a>
<a class="dessert" href="http://mywebsite.com/chocolate.php" title="Try out our new chocolate vanilla cookies">chocolate</a>
HTML;

$doc = new DomDocument();
$fragment = $doc->createDocumentFragment();
$fragment->appendXML($html);
$doc->appendChild($fragment);
$nodes = $doc->getElementsByTagName('a');

foreach ($nodes as $node) {
    $node->setAttribute(
        "title",
        preg_replace("~\bchocolate(?:(?:\hvanilla)?\hcookies)?\b~", "chocolate chip cookies", $node->getAttribute("title")
        )
    );
}
echo $doc->saveHTML();

输出

<a class="dessert" href="http://mywebsite.com/chocolate.php" title="Try out our new chocolate chip cookies">chocolate</a>
<a class="dessert" href="http://mywebsite.com/chocolate.php" title="Try out our new chocolate chip cookies">chocolate</a>
<a class="dessert" href="http://mywebsite.com/chocolate.php" title="Try out our new chocolate chip cookies">chocolate</a>