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

How to remove images and text from RSS feed description tag?

我从一些 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);

正文是"The post (Post Title) appeared first on (Website)".

要删除我使用的文本:

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>

代码:(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'

我希望这在很大程度上可以按照您需要的方式处理您的数据。第一个正则表达式模式肯定是最复杂的模式(请参阅 link 了解模式解释)。您将需要调整 [abc]\.com 以满足您的需要——可能会做类似 (?:test\.com|example\.net|sample\.co\.uk) 的事情。在你得到它之前 "just right" 只需将一些输入数据输入 regex101 并不断调整你的模式直到它起作用。

第二个和第三个模式只是为了清除文本包装器。虽然第二个不是真正必要的,因为 strip_tags() 会清除该子字符串,但第三个很关键,因为 strip_tags() 会留下悬空的 ]]>.

第一个模式不区分大小写 (i) 且兼容 unicode (u),以获得最佳结果。

^$ 是字符串定界符的开始和结束。如果它们不适合您的实际数据,则可以将其删除。这些步骤只是尝试 "mop up" 任何不需要的剩余子串。 trim() 调用当然是我要包含的内容,以便存储的数据尽可能干净。

如果要删除的特定 <p> 标记子字符串嵌套在要保留的两个子字符串之间,您可能希望添加另一个模式以将多个 \s{2,} 压缩为单个 space 或者你可以在我的第一个模式的末尾写 \s* 来捕获尾随的白色 spaces。这个只有你自己知道。