只要href属性不包含某个单词,就可以将目标添加到链接标记

时间:2011-05-11 09:52:34

标签: php regex preg-replace

我创建了这个函数:

<?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属性包含特定单词的所有链接标记,但我似乎无法找到正确的组合。你能帮助我吗?

2 个答案:

答案 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