Php 仅当锚';的URL包含

Php 仅当锚';的URL包含,php,html,regex,tags,anchor,Php,Html,Regex,Tags,Anchor,有人知道PHP中的正则表达式函数只在锚点的href属性包含特定文本的情况下才能去除锚点的内容吗 例如,我有一个HTML页面,整个页面都有链接。但我只想剥离URL中包含“yahoo”的锚。因此将变成:例如,HTML中不包含“yahoo”的其他锚定将被单独保留。首先,这不是正则表达式问题(或者至少不应该是)。PHP附带了一个HTML解析器,因此我强烈建议使用它 使用该选项时,只需循环浏览所有锚定标记,检查href属性,必要时进行修改,然后将其保存回HTML。例如: $dom = new DOMDoc

有人知道PHP中的正则表达式函数只在锚点的href属性包含特定文本的情况下才能去除锚点的内容吗


例如,我有一个HTML页面,整个页面都有链接。但我只想剥离URL中包含“yahoo”的锚。因此
将变成:例如,HTML中不包含“yahoo”的其他锚定将被单独保留。

首先,这不是正则表达式问题(或者至少不应该是)。PHP附带了一个HTML解析器,因此我强烈建议使用它

使用该选项时,只需循环浏览所有锚定标记,检查href属性,必要时进行修改,然后将其保存回HTML。例如:

$dom = new DOMDocument;
$dom->loadHTML($html); // $html as a string
$anchors = $dom->getElementsByTagName('a');
for ($i=0; i<$anchors->length; $i++) {
  $item = $anchors->item[$i];
  $href = $item->getAttribute('href');
  $host = parse_url($href, PHP_URL_HOST);
  if (stripos($host, 'yahoo') !== false) {
    $item->parentNode->removeChild($item);
  }
}
$html = $dom->saveHTML();
$dom=新的DOMDocument;
$dom->loadHTML($html);//$html作为字符串
$archors=$dom->getElementsByTagName('a');
对于($i=0;ilength;$i++){
$item=$anchors->item[$i];
$href=$item->getAttribute('href');
$host=parse_url($href,PHP_url_host);
if(stripos($host,'yahoo')!==false){
$item->parentNode->removeChild($item);
}
}
$html=$dom->saveHTML();
在此处使用是可选的。您可以简单地检查属性值中是否有“yahoo”,而不必只提取主机名

对于相同的问题,这比任何基于正则表达式的解决方案都要好得多,也更健壮。

试试这个功能

public function stripAnchorTags($html, $ignore_host = false, $charset="UTF-8"){
        $dom = new DOMDocument;
        $dom->loadHTML('<?xml version="1.0" encoding="'.$charset.'"?>'.$html); // $html as a string
        $anchors = $dom->getElementsByTagName('a');
        $length = $anchors->length;
        for($i=0; $i<$length; $i++){
            $item = $anchors->item(0);
            $href = $item->getAttribute('href');
            $host = parse_url($href, PHP_URL_HOST);
            if(!$ignore_host || stripos($host, $ignore_host) === false) {
                $item->parentNode->replaceChild($dom->createTextNode($href),$item);
            }
        }
        return preg_replace('/^<!DOCTYPE.+?>/', '', str_replace( array('<html>', '</html>', '<body>', '</body>'), array('', '', '', ''), $dom->saveXML($dom->documentElement)));
    }
公共函数stripAnchorTags($html,$ignore\u host=false,$charset=“UTF-8”){
$dom=新的DOMDocument;
$dom->loadHTML('.$html);//$html作为字符串
$archors=$dom->getElementsByTagName('a');
$length=$anchors->length;
对于($i=0;$iitem(0);
$href=$item->getAttribute('href');
$host=parse_url($href,PHP_url_host);
if(!$ignore_host | | stripos($host,$ignore_host)==false){
$item->parentNode->replaceChild($dom->createTextNode($href),$item);
}
}
返回preg_replace('/^/','',str_replace(数组('','',''),数组('','',''),$dom->saveXML($dom->documentElement));
}
您可以像这样使用stripAnchorTags($html)


如果你想让它忽略雅虎链接,那么就这样称呼它为stripAnchorTags($html,“yahoo”)

对不起,Tony,会变成什么样子?-1 |如果他打算永久更改文件,他最好使用一个功能强大的编辑器来完成这项工作。好的,你的解决方案看起来不错,但还有两个问题。至于性能和内存使用情况,与正则表达式解决方案相比,这会有多大的效率?这似乎会给您带来更多的开销这个选项。另外,我还没有对此进行测试,但在您的示例中,似乎您只是修改了锚点的href属性,而没有剥离锚点的标记。我仍然不知道正则表达式对此有何作用,但我认为preg_替换可以做到这一点。@Tony如果您将此作为呈现pag的一部分来做的话e那么网络延迟可能是一个更大的工厂,除非你在一个非常大的文档上这样做。内存使用量基本上是文档大小的线性函数,处理时间也是如此。如果你陷入过多的回溯场景,正则表达式可能更不可预测。@Tony也改为remo请删除该元素。谢谢cletus,但我仍然认为您没有正确阅读该问题。我只想删除标记,并保留锚的内容,前提是href包含yahoo。下面是另一个示例:
->此文本