首页 > 解决方案 > 如何使用 PHP 替换所有标题属性中的单词

问题描述

我四处搜索,只找到了不特定于我下面需要的替换选项。

然而,我发现最接近的是:

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

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

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

例如:我将在所有标题属性中将单词“巧克力”、“巧克力饼干”和“巧克力香草饼干”更改为“巧克力片饼干”,如下例所示。

但是,我不想更改URL 或链接文本中的“巧克力”一词。

共有 50 个项目列表和 50 个单独的超链接,所有这些都放在一个数组中。因此,替换代码最好在一个语句中替换整个数组中的单词。

注意:如果示例 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>

谢谢你。

标签: phpreplaceattributescharacter-replacement

解决方案


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

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

解释

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

正则表达式演示| php演示

如果模式匹配,那么您可以设置新标题。

$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>

推荐阅读