2011-05-11 48 views
0

我创造了这个功能,链接标签,只要:添加目标作为href属性不包含特定字词的

<?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; 
    } 
?> 

的目标是一个目标=“_空白”添加到所有链接标签。

现在我的问题是,我需要跳过所有的链接标签,其中href属性包含一个特定的词,但我似乎无法找到适当的组合。你们能帮我吗?

+0

它是一个必须用正则表达式来做到这一点,或者你可以把它改成使用PHPS XML函数(DOM *)? – Yoshi 2011-05-11 10:08:59

+0

如果PHP DOM不会因为HTML损坏而失败,我可以提供建议吗? – Repox 2011-05-11 10:15:10

回答

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(); 
+0

据我所知,这可以很好地工作 - 即使缺少结束标签。感谢您提供备用解决方案。 – Repox 2011-05-11 10:23:03

1

一个正则表达式的解决方案可以是这样的:

<(a)(?!.*?href="[^"]*SPECIFICWORD)([^>]+)> 

负先行(?!.*?href="[^"]*SPECIFICWORD)用于检查“SPECIFICWORD”是href属性中,如果是正则表达式不匹配。

看到这里online on Regexr

相关问题