我创建了这个函数:
<?php
function target_links( $html )
{
$pattern = "/<(a)([^>]+)>/i";
$replacement = "<\\1 target=\"_blank\"\\2>";
$new_str = preg_replace($pattern,$replacement,str_replace('target="_blank"','',$html));
return $new_str;
}
?>
目标是为所有链接标记添加target =“_ blank”。
现在我的问题是我需要跳过href
属性包含特定单词的所有链接标记,但我似乎无法找到正确的组合。你能帮助我吗?
答案 0 :(得分:1)
我不确定“因为破坏HTML而没有失败”,但是如果你可以让DomDocument接受你的HTML,请尝试类似:
<?php
$dom = new DOMDocument();
$dom->loadHtml('<html>
<a href="...protected...">some link</a>
<a href="...change me...">some link</a>
</html>');
$xpath = new DOMXpath($dom);
foreach ($xpath->query('//a[not(contains(@href, "protected"))]') as $node) {
$node->setAttribute('target', '_blank');
}
header('Content-Type: text/html; charset="UTF-8"');
echo $dom->saveHtml();
答案 1 :(得分:1)
正则表达式解决方案可能如下所示:
<(a)(?!.*?href="[^"]*SPECIFICWORD)([^>]+)>
负前瞻(?!.*?href="[^"]*SPECIFICWORD)
用于检查“SPECIFICWORD”是否在href属性中,如果是,则正则表达式不匹配。
请参阅此处online on Regexr