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

问题描述

我到处搜索,只发现了以下我不需要的替代选项。

但是,我发现最接近的东西是这样:

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

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

简而言之,如果可能的话,我想在一个语句中全局地将所有标题属性(title =“”)中的特定单词替换为其他单词。 这对超链接和图像标题属性均适用。

例如: 我需要将“ 巧克力”,“ 巧克力饼干”和“ 巧克力香草饼干”改为“ 巧克力片” Cookie ”,如下例所示。

但是,我不想在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>

谢谢。

解决方法

例如,您可以将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>