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

Php 如何从RSS提要描述标记中删除图像和文本?,php,regex,xml,rss,feed,Php,Regex,Xml,Rss,Feed,我从一些RSS提要网站上获得了描述,其中一些描述包含我想要删除的图像和特定文本 获取提要的代码: $rss = simplexml_load_file($website); foreach ($rss->channel->item as $item) { $description = (string)$item->descritpion; } 以下是我得到的不同格式: <description><![CDATA[ <p> //Po

我从一些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>
正文是“文章(标题)首先出现在(网站)”上

要删除该文本,我使用:

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

我希望这将在很大程度上以您需要的方式处理您的数据。第一个正则表达式模式当然是最复杂的(请参阅链接以了解模式解释)。您将需要调整
[abc]\.com
以满足您的需要--可能会执行类似
(?:test\.com | example\.net | sample\.co\.uk)
。在您获得“恰到好处”之前,只需将一些输入数据输入到regex101中,并不断调整您的模式,直到它起作用为止

第二个和第三个模式只是为了清除文本包装。第二个是不必要的,因为
strip\u tags()
会清除子字符串,第三个是关键的,因为
strip\u tags()
会留下悬空的
]>

第一种模式不区分大小写(
i
)和unicode容错(
u
)以获得最佳结果

^
$
是字符串分隔符的开头和结尾。如果它们不适合您的实际数据,可以删除它们。这些步骤只是试图“清除”任何不需要的剩余子字符串。
trim()
调用肯定是我要包含的,以便存储的数据尽可能干净


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

您能给我们一个有效的数据样本和一个无效的数据样本吗?通过将源数据相互比较,我们可以发现可能导致结果不一致的任何差异。上述给定XML的预期输出是什么?@LovePreetingh,没有图像的描述标记内部文本或文本“文章(文章标题)首先出现在(网站名)”这与regex有什么关系?我在帖子的任何地方都没有看到提到它。@emsimpson92,我没有使用它,但它可以用来替换那个文本,我正在寻找可能的解决方案
 <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>
<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>
$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'