我有许多链接和其他 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 />
,但我想这种情况没问题。