删除除特定链接PHP之外的所有html链接

时间:2016-01-14 11:03:17

标签: php html regex

我的字符串包含许多链接和其他hmtl标记,我需要删除字符串中的所有链接,但具有特定html数据属性的链接除外。例如:

<p>Some text, <a data-special="special-link" href="link.com">Needs to stay</a> more text <br /> more tags, <a href="link.com">Needs to go</a>

我试过这个,没有匹配任何东西

 preg_replace('#<a (?![^>]data-special="special-link") .*?>(.*?)</a>#i', '\1', $result["body_value"]);

2 个答案:

答案 0 :(得分:1)

最佳做法是使用DOM或其​​他HTML解析器来处理HTML代码。

由于您的输入字符串似乎不是有效的XHTML,您可以使用基本的DOM解析器删除不需要的链接:

$html = <<<DATA
<p>Some text, <a data-special="special-link" href="link.com">Needs to stay</a> more text <br /> more tags, <a href="link.com">Needs to go</a>
DATA;

$dom = new DOMDocument('1.0', 'UTF-8');
$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);

$xpath = new DOMXPath($dom);
$links = $xpath->query('//a');

foreach($links as $link) { 
   if ($link->getAttribute('data-special') == "special-link")
   {
      $newTxtNode = $dom->createTextNode($link->textContent);
      $link->parentNode->replaceChild($newTxtNode, $link);
   }
}
echo $dom->saveHTML();

请参阅IDEONE demo

这会将<br />替换为<br>,但我认为这种情况没问题。

答案 1 :(得分:1)

仅适用于您的情况:要从字符串中删除除属性data-special="special-link"之外的所有链接,请使用以下方法:

$str = '<p><a href="link.com">Needs to go first </a> Some text, <a data-special="special-link" href="link.com">Needs to stay</a> more text <br /> more tags, <a href="link.com">Needs to go</a>';
$res = preg_replace('/<a (?![^>]*data-special="special-link").*?>(.*?)<\/a>/i', '', $str);