【问题标题】:Keeping anchor tags and removing other hyperlinks保留锚标记并删除其他超链接
【发布时间】:2017-02-05 20:23:08
【问题描述】:

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

锚标记示例:

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

跳转到

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

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

页面中的所有其他超链接(有或没有类属性)都需要删除。如何才能做到这一点?我应该使用 php regex 吗?

【问题讨论】:

  • 使用DOMDocument & DOMXPath 比使用正则表达式更容易
  • 试图打开一点解决方案

标签: php anchor


【解决方案1】:

使用DOMDocument & DOMXPath 比使用RegEx 在html 中查找合适的标签要容易得多,如下所示。

最后一行只是将最终编辑的 html 回显到文本区域中,但您可以很容易地将其保存到文件中。

/* 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>";
}

【讨论】:

    猜你喜欢
    • 2023-03-31
    • 2014-07-02
    • 2013-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-15
    • 1970-01-01
    相关资源
    最近更新 更多