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


Removing all html links except specific links PHP

我有许多链接和其他 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"]);

仅针对您的情况:要从字符串中删除除具有属性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);

最佳做法是使用 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 演示

这将用<br>替换<br />,但我想这种情况没问题。

相关文章: