替换链接标题


Replace link title

我需要根据以下规则对html页面属性标题中的每个链接执行正则表达式:

  1. 链接等于锚文本
  2. 链接不具有标题属性

我写了这个代码:

$x = 'gg <a href="#">Anchor 1</a>, <a href="#" title="text">Anchor 2</a>';
echo preg_replace('/'<a([^<]*)(?!title)>([^<]+)'<'/a/isu', '<a${1} title="${2}">${2}</a', $x);

但我得到了一个意想不到的结果:

gg <a href="#" title="Anchor 1">Anchor 1</a>, <a href="#" title="text" title="Anchor 2">Anchor 2</a>

第二个链接有两个标题属性。为什么这没有按预期工作?我该怎么修?

在您的表达式中:

<a([^<]*)

这一直匹配到下一个左括号,但在表达式中被进一步向下的>停止;同时它跳过CCD_ 2。

也就是说,这个问题最好在HTML域而不是文本域中表达:

$contents = <<<'EOS'
gg <a href="#">Anchor 1</a>, <a href="#" title="text">Anchor 2</a>
EOS;
$doc = new DOMDocument;
$doc->loadHTML($contents);
// find all anchors
foreach ($doc->getElementsByTagName('a') as $anchor) {
        if (!$anchor->hasAttribute('title')) {
                $anchor->setAttribute('title', $anchor->textContent);
        }
}
echo $doc->saveHTML();

为了只保存你感兴趣的节点,你必须使用这种结构:

foreach ($doc->getElementsByTagName('p')->item(0)->childNodes as $childNode) {
        echo $doc->saveHTML($childNode);
}