Обмен <a>на <span>с использованием PHP - PullRequest
0 голосов
/ 25 марта 2019

Может кто-нибудь помочь мне отредактировать мой вопрос, чтобы он соответствовал SO правилам?Я задал правильный вопрос и получил ответ от полезного SO'er, но он не был хорошо принят сообществом SO

Я вытащил блок кода, удаляя ненужныйзатем используйте оставшийся код на моей странице.

Код содержит якорные теги, ссылки на которые я не хочу хранить, но мне нужно иметь возможность оставлять стили для элементов ссылок.

IВ настоящее время используется

$tweettext = strip_tags($tweettext, '<div>, <p>, <a>');

, который работает.Но оставляет меня с якорными тегами, которые ссылаются на неработающие ссылки (они не работают, поскольку он использует относительные ссылки и извлекается с внешнего сайта).

Если я использую

$tweettext = strip_tags($tweettext, '<div>, <p>');

Удаляетненужные ссылки, но теперь у меня нет элемента, к которому можно применить стили.

Могу ли я поменять тег с тега 'a' на тег 'span' перед тем, как пропустить его, чтобы удалить ненужныетеги («a» не требуется, если текст «a» обернут в «span»)?

Так что я могу использовать

$tweettext = strip_tags($tweettext, '<div>, <p>, <span>');

Мне просто нужен прямой обмен 'aФункция 'to' span '.

CODE PON DE REQUEST (не имеет отношения к моему актуальному вопросу, я просто хочу узнать функцию, в которой я могу swap_tags () или swap_text ()):

Рабочий код (с использованием preg_match (), ответ на мой вопрос):

<?php
foreach($tweet->find('.tweet-text') as $tweettext) {
    $tweettext = str_ireplace('TweetTextSize TweetTextSize--normal js-tweet-text ', '', $tweettext);
    $tweettext = str_ireplace('data-aria-label-part="0"', '', $tweettext);
    $tweettext = str_ireplace('lang="en" ', '', $tweettext);
    $tweettext = str_ireplace('data-query-source="hashtag_click" ', '', $tweettext);
    $tweettext = str_ireplace(' pretty-link js-nav" dir="ltr" ', '"', $tweettext);
    $tweettext = preg_replace('/href=".*?"/', '', $tweettext);
    $tweettext = str_ireplace('<a', '<span', $tweettext);
    $tweettext = str_ireplace('</a>', '</span>', $tweettext);
    $tweettext = strip_tags($tweettext, '<div>, <p>, <span>');
    if($imgmatches[1] != '') {
        $tweettext = str_ireplace('tweet-text', 'tweet-text tweet-has-bg-text ', $tweettext);
    } else {
        $tweettext = str_ireplace('tweet-text', 'tweet-text', $tweettext);
    }
    echo $tweettext;
}

Правильный вывод:

<p class="tweet-text">
    We’ve got a number of international exhibition stand builds this quarter; including <span class="twitter-atreply" data-mentioned-user-id="441777148">@StocExpo</span> in Rotterdam. This is the 4th year we have undertaken a stand at StocExpo for <span class="twitter-atreply" data-mentioned-user-id="290202396">@Dantecltd</span> <span class="twitter-hashtag">#exhibition</span> <span class="twitter-hashtag">#StocExpo</span>
</p>

Спасибо, Джейсон.

Ответы [ 2 ]

1 голос
/ 25 марта 2019

Оператору не нужен объект DOMDocument, как указано RamRaider , а скорее строка, которая используется в качестве HTML, что делает регулярное выражение наилучшей операцией, подходящей в этом случае, подходящее выражение регулярного выражения для следующего дело получается, есть в этот ответ
что тоже

$content = preg_replace("/<a href=.*?>(.*?)<\/a>/","",$content);
0 голосов
/ 25 марта 2019

Нет функции "swap_tags" для решения вашей проблемы, но вы можете создать свой собственный, используя DOMDocument вместо замены строки, как указано выше.Следующее должно продемонстрировать, как это может быть достигнуто.Он загружает строку HTML в объект DOMDocument и ищет все гиперссылки.Когда он найдет гиперссылки, он будет работать в обратном направлении по дереву DOM для выполнения модификаций (если вы будете выполнять итерацию вперед, он остановится после первого мода)

Атрибуты каждой встреченной гиперссылки добавляются во вновь созданный *Элемент 1006 * - вы можете изменить его или добавить фильтр для исключения определенных атрибутов (например, href)

<?php

    $str='<p class="tweet-text">
        We’ve got a number of international exhibition stand builds this quarter; including 
        <a href="/StocExpo" class="twitter-atreply pretty-link js-nav" dir="ltr" data-mentioned-user-id="441777148">@StocExpo</a>
        in Rotterdam. This is the 4th year we have undertaken a stand at StocExpo for 
        <a href="/Dantecltd" class="twitter-atreply pretty-link js-nav" dir="ltr" data-mentioned-user-id="290202396">@Dantecltd</a> 
        <a href="/hashtag/exhibition?src=hash" data-query-source="hashtag_click" class="twitter-hashtag pretty-link js-nav" dir="ltr">#exhibition</a> 
        <a href="/hashtag/StocExpo?src=hash" data-query-source="hashtag_click" class="twitter-hashtag pretty-link js-nav" dir="ltr">#StocExpo</a>
    </p>';

    libxml_use_internal_errors( true );
    $dom=new DOMDocument;
    $dom->strictErrorChecking=false;
    $dom->validateOnParse=false;
    $dom->recover=true;
    $dom->loadHTML( $str );
    libxml_clear_errors();


    $col = $dom->getElementsByTagName('a');
    if( $col->length > 0 ){

        for( $i=$col->length; $i > 0; $i-- ){
            $node=$col->item( $i );

            if( !empty( $node ) && $node->nodeType==XML_ELEMENT_NODE ){
                $span=$dom->createElement('span', $node->nodeValue );


                foreach( $node->attributes as $attr ){
                    $attribute=$dom->createAttribute( sprintf('data-%s',$attr->nodeName ) );
                    $attribute->nodeValue=$attr->nodeValue;
                    $span->appendChild( $attribute );
                }

                $node->parentNode->replaceChild( $span, $node );
            }
        }


        printf('<textarea cols=100 rows=20>%s</textarea>', $dom->saveHTML() );
    }

?>
...