正则表达式用引号捕获锚文本

时间:2018-02-15 01:22:56

标签: php regex anchor

我正在尝试用正则表达式来捕捉引用文本的锚点。例如:

<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过滤器。

1 个答案:

答案 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);

Pattern Demo