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 正規表現を使用して、ファイルから author タグとその内容、media:content タグとその内容全体、および position タグとその内容を完全に削除するにはどうすればよいですか?

ありがとう!

4

4 に答える 4

3

HTML/XML の解析に Regex を使用しないでください。完全に優れたパーサーがあります。

<?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 に答える