如何从RSS feed描述标签中删除图像和文本?

时间:2018-07-03 12:37:19

标签: php regex xml rss feed

我从一些RSS feed网站上获取描述,其中一些描述包含要删除的图像和特定文本。

获取供稿的代码:

$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),没有显示图像。

但是当我使用代码删除字符串时,它并不能与所有描述一起使用,其中有些仍然包含字符串。

更新:

<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 :(得分:1)

代码:(Demo

$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并不断调整模式,直到它起作用为止。

第二个和第三个模式只是清除文本包装程序。虽然第二个并不是真正必要的,因为strip_tags()会清除该子字符串,但第三个至关重要,因为strip_tags()会留下一个悬垂的]]>

第一个模式不区分大小写(i)和Unicode容忍(u),以获得最佳效果。

^$是字符串定界符的开头和结尾。如果它们不适合您的实际数据,则可以将其删除。这些步骤仅是尝试“删除”任何不需要的残留子字符串。我肯定会加入trim()调用,以使存储的数据尽可能干净。

如果要删除的特定<p>标记子字符串嵌套在两个要保留的子字符串之间,则您可能希望添加其他模式以将多个\s{2,}压缩为单个空格,或者您可以写成{ {1}}在我的第一个模式末尾以捕获尾随空白。只有你会知道这一点。