Как удалить изображения и текст из тега описания RSS-канала? - PullRequest
0 голосов
/ 03 июля 2018

Я получаю описание с некоторых веб-сайтов RSS-каналов. Некоторые из этих описаний содержат изображения и определенный текст, который я хочу удалить.

Код для получения фида:

$rss = simplexml_load_file($website);
foreach ($rss->channel->item as $item) {
    $description = (string)$item->descritpion;
}

Это разные форматы, которые я получаю:

<description><![CDATA[
    <p> //Post Description </p>
    <p>The post <a rel="nofollow" href="">
        //Post Title.</a> appeared first on 
        <a rel="nofollow" href="">//Feed Website.</a>.
    </p>
]]></description>
_________________________________________________________________
<description><![CDATA[
    <div>
        <strong>//Some Text.</strong>
    </div>
    <div>
        &nbsp;
    </div>
    <div>//Some Text.</div>
    <div>
        <img alt="" src="" style="width: 640px; height: 427px;" />
    </div>
]]></description>
_______________________________________________________________
<description>
    &lt;img style="margin:0 1em 1em 0;" align="left" src=""/&gt;
    „//Some Text. 
</description>

Чтобы удалить изображения:

$description = (string)strip_tags($item->description);

Текст «Сообщение (Заголовок сообщения) появилось первым на (Веб-сайте)».

Чтобы удалить этот текст, я использую:

if (strpos($description, 'appeared first')) {
    $siteNames = array('a.com', 'b.com', 'c.com');
    foreach ($siteNames as $siteName) {
        if(strpos($description, $siteName)){
            $appeared = 'The post '.$item->title.' appeared first on '.$siteName;
            $description = str_replace($appeared, '', $description);
        }

    }
}

Так, например, если описание содержит:

 <p>The post 
    <a rel="nofollow" href="http://a.com/what-is-php">What is PHP.</a> 
    appeared first on 
    <a rel="nofollow" href="http://a.com">a.com.</a>.
</p>

Затем этот текст следует удалить.

Затем я использую strip_tags($item->description), изображения не отображаются.

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

UPDATE:

<description><![CDATA[
    <p>Við vorum að fá inn til okkar forfallaholl í Laugardalsá á best tíma. Annarsvegar er um að ræða hollið 18-21. júlí og síðan hollið 24-27. júlí. Bæði eru hollin á frábærum tíma í ánn. Þó svo um 3ja daga holl sé að ræða, er að hægt að skoða staka daga eða 1 1/2 eða 2
    </p>
    <p>The post <a rel="nofollow" href="https://a.com/post-title/">Laugardalsá &#8211; forfallaholl á besta tíma</a> appeared first on <a rel="nofollow" href="https://a.com">a.com</a>.</p>
]]></description>

1 Ответ

0 голосов
/ 05 июля 2018

Код: ( Демо )

$xml = '<![CDATA[
    <p>Við vorum að fá inn til okkar forfallaholl í Laugardalsá á best tíma. Annarsvegar er um að ræða hollið 18-21. júlí og síðan hollið 24-27. júlí. Bæði eru hollin á frábærum tíma í ánn. Þó svo um 3ja daga holl sé að ræða, er að hægt að skoða staka daga eða 1 1/2 eða 2
    </p>
    <p>The post <a rel="nofollow" href="https://a.com/post-title/">Laugardalsá &#8211; forfallaholl á besta tíma</a> appeared first on <a rel="nofollow" href="https://a.com">a.com</a>.</p>
]]>';

$finds = [
    '~<p>The post <a rel="nofollow" href="https?://[a-z]+\.com[^"]*">.*?</a> appeared first on <a rel="nofollow" href="https?://[a-z]+\.com[^"]*">.*?</a>\.</p>~iu',
    '~^<!\[CDATA\[~',
    '~\]\]>$~'
];

var_export(trim(strip_tags(preg_replace($finds, '', $xml))));

Выход:

'Við vorum að fá inn til okkar forfallaholl í Laugardalsá á best tíma. Annarsvegar er um að ræða hollið 18-21. júlí og síðan hollið 24-27. júlí. Bæði eru hollin á frábærum tíma í ánn. Þó svo um 3ja daga holl sé að ræða, er að hægt að skoða staka daga eða 1 1/2 eða 2'

Я ожидаю, что это должно в значительной степени обрабатывать ваши данные так, как вам нужно. Первый шаблон регулярных выражений, безусловно, самый привлекательный (см. Ссылку для объяснения шаблона). Вам нужно будет настроить [abc]\.com в соответствии с вашими потребностями - возможно, сделать что-то вроде (?:test\.com|example\.net|sample\.co\.uk). Пока вы не получите его «просто правильно», просто введите некоторые входные данные в regex101 и продолжайте настраивать ваш шаблон, пока он не заработает.

2-й и 3-й шаблоны предназначены только для удаления текстовых оболочек. В то время как второй не является действительно необходимым, потому что strip_tags() удалит эту подстроку, третий является критическим, потому что strip_tags() оставит висячий ]]>.

Первый шаблон нечувствителен к регистру (i) и устойчив к юникоду (u) для достижения наилучших результатов.

^ и $ - начало и конец разделителей строк. Если они не подходят для ваших фактических данных, они могут быть удалены. Эти шаги являются просто попытками «убрать» любые нежелательные остаточные подстроки. Вызов trim() - это, безусловно, то, что я бы включил, чтобы сохраненные данные были максимально чистыми.

Если указанная удаляемая подстрока <p> вложена между двумя подстроками, которые вы хотите сохранить, вы можете добавить другой шаблон для сжатия нескольких \s{2,} в один пробел ИЛИ вы можете написать \s* в конец моего первого паттерна для захвата конечных пробелов. Только вы будете знать это.

...