我的字符串包含许多链接和其他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"]);
答案 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);