1

这是我的 RSS 文件的示例结构:

<item>
 <title>My Title</title>
 <link>http://www.link.com</link>
 <description>The description</description>
 <author>Blah Blah</author>
 <pubDate>Thu, 26 Jul 2012 10:17:15 -0400</pubDate>
 <media:content url="myimage.jpg">
  <media:title>sdafsd</media:title>
 </media:content>
 <position>1</position>
</item>

如何使用 PHP 正则表达式从文件中完全删除作者标签及其内容、整个 media:content 标签及其内容以及位置标签及其内容?

谢谢!

4

4 回答 4

3

不要使用 Regex 来解析 HTML/XML,那里有非常好的解析器:

<?php

$xml = <<<XML
<item>
    <title>My Title</title>
    <link>http://www.link.com</link>
    <description>The description</description>
    <author>Blah Blah</author>
    <pubDate>Thu, 26 Jul 2012 10:17:15 -0400</pubDate>
    <media:content url="myimage.jpg">
        <media:title>sdafsd</media:title>
    </media:content>
    <position>1</position>
</item>
XML;

$dom = new DOMDocument();
//DOMDocument throws warnings when the XML is invalid, we don't care.
//Though in this case, the media: namespace would be ignored because it's not defined.
@$dom->loadXML($xml);
$document = $dom->documentElement;

//Find the elements you want to remove
$author = $document->getElementsByTagName("author")->item(0);
$content = $document->getElementsByTagName("content")->item(0);

//And remove them.
$document->removeChild($author);
$document->removeChild($content);

//Output the resulting XML.
echo $dom->saveXML();
于 2012-08-22T13:30:24.547 回答
1

我之前的回答被 - 理所当然地 - 删除了,我应该将其添加为评论。这是 DomDocument 做你想做的事情的另一种选择:

<?php

$xml = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>bla</title>
    <link>bla</link>
    <description>A description</description>
    <language>en-us</language>
    <item xmlns:media="http://search.yahoo.com/mrss/">
     <title>My Title</title>
     <link>http://www.link.com</link>
     <description>The description</description>
     <author>Blah Blah</author>
     <pubDate>Thu, 26 Jul 2012 10:17:15 -0400</pubDate>
     <media:content url="myimage.jpg">
      <media:title>sdafsd</media:title>
     </media:content>
     <position>1</position>
    </item>
  </channel>
</rss>
XML;

$doc = new DOMDocument();
$doc->loadXml( $xml );

foreach( $doc->getElementsByTagName( 'item' ) as $item ) {
    $item->removeChild( $item->getElementsByTagName( 'author' )->item( 0 ) );
    $item->removeChild( $item->getElementsByTagName( 'position' )->item( 0 ) );
            $item->removeChild( $item->getElementsByTagName( 'content' )->item( 0 ) );
}

var_dump( $doc->saveXml( ) );
于 2012-08-22T13:40:49.513 回答
0

免责声明: 为了灵活性和可靠性,您应该始终使用适当的解析器,例如DOMDocument处理 XML/HTML。话虽如此,如果您确定您的标记格式正确,不会更改结构,并且不会包含嵌套的重复标签,那么正则表达式可以解决此类问题。但是,只有在您知道自己在做什么的情况下,您才应该使用它们。


您将希望使用preg_replace()空字符串 ( "") 替换每个匹配项。以下是如何为<author>...</author>块完成的:

$markup = preg_replace('#<author>(.*?)</author>#is', '', $markup);

基本上这匹配开始标签<author>,开始/结束标签之间的任何(或没有)和结束标签</author>

其他标签可以以类似的方式删除。

于 2012-08-22T13:23:25.830 回答
0
   $content = file_get_contents($file_name)

$xmlElem = 'author'
$content = preg_replace('#<' . $xmlElem . '(?:\s+[^>]+)?>(.*?)</' . $xmlElem . '>#s', '', $content)


$xmlElem = 'media:content'
$content = preg_replace('#<' . $xmlElem . '(?:\s+[^>]+)?>(.*?)</' . $xmlElem . '>#s', '', $content)


$xmlElem = 'position'
$content = preg_replace('#<' . $xmlElem . '(?:\s+[^>]+)?>(.*?)</' . $xmlElem . '>#s', '', $content)
于 2012-08-22T13:30:31.693 回答