2016-09-28 86 views
0

页面具有链接到其他页面的超链接以及锚定标记以跳转到页面内的位置。我想保留锚标签并删除所有其他超链接。保留锚定标记并删除其他超链接

锚标记示例:

<a class="footnote" href="#fnx" id="fnx_ref">x</a> 

跳到

<a class="footnote" href="#fnx_ref">x</a> 

其中x1,2,3,4 ... n

页面内的所有其他超链接(带或不带类属性)都需要删除。如何才能做到这一点?我应该使用php正则表达式

+0

使用'DOMDocument'&'DOMXPath'比正则表达式更容易 – RamRaider

+0

试图稍微打开该解决方案 –

回答

1

与其使用RegEx在html中查找合适的标签,使用DOMDocument & DOMXPath如下所示相当容易。

最后一行只是将最终编辑后的html回显到textarea中,但您可以轻松将它保存到文件中。

/* XPath expression to find all anchors that do not contain "#" */ 
$query='//a[ not (contains(@href, "#")) ]'; 

/* Some url */ 
$url='http://stackoverflow.com/questions/39737604/keeping-anchor-tags-and-removing-other-hyperlinks-php-regex'; 

/* get the data */ 
$html=file_get_contents($url); 

/* construct DOMDocument & DOMXPath objects */ 
$dom=new DOMDocument; 
$dom->loadHTML($html); 
$xp=new DOMXPath($dom); 

/* Run the query */ 
$col=$xp->query($query); 

/* Process all found nodes */ 
if(!empty($col)){ 
    /* 
     As you are removing nodes from the DOM you should 
     iterate backwards through the collection. 
    */ 
    for ($i = $col->length; --$i >= 0;) { 
     $a = $col->item($i); 
     $a->parentNode->removeChild($a); 
    } 

    /* do something with processed html */ 
    echo "<textarea cols=150 rows=100>",$dom->saveHTML(),"</textarea>"; 
}