Php 如何从RSS提要描述标记中删除图像和文本?
我从一些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 = 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>
</div>
<div>//Some Text.</div>
<div>
<img alt="" src="" style="width: 640px; height: 427px;" />
</div>
]]></description>
_______________________________________________________________
<description>
<img style="margin:0 1em 1em 0;" align="left" src=""/>
„//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á – 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á – 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'