我正在尝试用正则表达式来捕捉引用文本的锚点。例如:
<a href="www.example.com">this is "some quoted anchor text" example</a>
<a href="www.example.com">this is “another” example with different quote type</a>
我在这里想出了这个,但在我的php 5.5.9环境中感觉臃肿并且无法正常工作:
https://regex101.com/r/NugIi2/3
我确信有更好的方法来捕捉这些引用的锚文本。
编辑:我应该提到我需要修复AMP页面上的错误,因为带有引号的锚文本。因此在这种情况下不可能进行DOM操作。确切地说,我在后端使用带有preg_replace的worpdress the_content过滤器。
答案 0 :(得分:1)
Geez ......几个小时之后,我成功地将一个有效的DomDocument解决方案整合在一起!如果有一种更清洁的方式来保持准确性,我欢迎任何人告诉我。
代码:(Demo)
$html=<<<HTML
<a href="bla">123 "this" is asd</a>
<a href="bla">this should not be captured</a>
<a href="bla">no quotes in anchor text here</a>
<a href="bla">"445 is in quotes"</a>
<a href="bla">asd "blabla" sometimes</a>
<a href="bla">Je commence à avoir mal à la tête</a>
<a href="bla">something with quotes like “blabla” is bad</a>
HTML;
$dom = new DOMDocument;
$html=mb_convert_encoding($html,'HTML-ENTITIES',"UTF-8"); // for multibyte chars
$dom->loadHTML($html,LIBXML_HTML_NODEFDTD); // remove DOCTYPE, but allow <html><body> tags for stability
foreach($dom->getElementsByTagName('a') as $a){
if(preg_match('~["“”]~u',$a->nodeValue)){
$remove[]=$a; // collect the nodes to remove
}
}
foreach($remove as $bad_a){
$bad_a->parentNode->removeChild($bad_a); // remove targeted nodes
}
$result=mb_convert_encoding($dom->saveHTML(),"UTF-8",'HTML-ENTITIES'); // for multibyte chars
echo preg_replace(['~^<html><body>|</body></html>$~','~\R+~'],['',"\n"],$result); // mop up <html> and <body> tags, and consecutive newline characters
输出:
<a href="bla">this should not be captured</a>
<a href="bla">no quotes in anchor text here</a>
<a href="bla">Je commence à avoir mal à la tête</a>
或者如果你不想搞砸所有这些,这里有一个正则表达的正则表达式:
代码:(Demo)
echo preg_replace('~<a[^>]*>.*?["“”].*?</a>\R?~u','',$html);