如何使用 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>
谢谢。
例如,您可以使用 DomDocument 和 getElementsByTagName
来查找元素并使用模式测试 title 属性的值:
\bchocolate(?:(?:\hvanilla)?\hcookies)?\b
说明
\b
字边界
chocolate
字面匹配
(?:
非捕获组
(?:\hvanilla)?
可选择匹配水平空白字符和 vanilla
\hcookies
匹配水平空白字符和 cookies
)?
关闭组并使其可选
\b
字边界
如果模式匹配,则可以设置新标题。
$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>
我四处搜索,只找到了不符合我以下需求的替换选项。
然而,我找到的最接近的是:
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>
谢谢。
例如,您可以使用 DomDocument 和 getElementsByTagName
来查找元素并使用模式测试 title 属性的值:
\bchocolate(?:(?:\hvanilla)?\hcookies)?\b
说明
\b
字边界chocolate
字面匹配(?:
非捕获组(?:\hvanilla)?
可选择匹配水平空白字符和 vanilla\hcookies
匹配水平空白字符和 cookies
)?
关闭组并使其可选\b
字边界
如果模式匹配,则可以设置新标题。
$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>