这可以完成工作:
$newText = '<span>(This link opens in a new window)</span>';
$pattern = '~<a\s[^>]*?\btarget\s*=(?:\s*([\'"])_blank\1|_blank\b)[^>]*>[^<]*(?:<(?!/a>)[^<]*)*\K~i';
echo preg_replace($pattern, $newText, $html);
然而,这种直接的字符串方法也可以替换 css 或 javascript 代码中的注释 html 部分、字符串或注释,并最终替换为 javascript 文字正则表达式,这充其量是不需要的,最坏的情况是根本不需要。这就是为什么如果你想避免这些陷阱,你应该使用 DOM 方法。您所要做的就是将一个新节点附加到具有所需属性的每个链接:
$dom = new DOMDocument;
libxml_use_internal_errors(true);
$dom->loadHTML($html);
$xp = new DOMXPath($dom);
$nodeList = $xp->query('//a[@target="_blank"]');
foreach($nodeList as $node) {
$newNode = dom->createElement('span', '(This link opens in a new window)');
$node->appendChild($newNode);
}
$html = $dom->saveHTML();
最后,最后一个选择是完全不更改 html 并使用 css:
a[target="_blank"]::after {
content: " (This link opens in a new window)";
font-style: italic;
color: red;
}