Сохранение якорных тегов и удаление других гиперссылок

Страница имеет гиперссылки, связанные с другими страницами, а также якорные теги для перехода к местоположению на странице. Я хотел бы сохранить теги привязки и удалить все другие гиперссылки.

Пример тегов привязки:

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

прыгает к

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

где x является 1,2,3,4 ... n,

Все остальные гиперссылки (с атрибутом класса или без него) на странице должны быть удалены. Как это может быть сделано? Должен ли я использовать PHP регулярное выражение?

1 ответ

Решение

Вместо того, чтобы использовать RegEx чтобы найти подходящие теги в HTML, это значительно проще в использовании DOMDocument & DOMXPath как ниже.

Последняя строка просто выводит окончательно отредактированный html в текстовую область, но вы можете достаточно легко сохранить его в файл.

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

/* Some url */
$url='http://stackru.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>";
}
Другие вопросы по тегам