2012-08-22 52 views
1

刪除標籤和內容這是我的RSS文件的示例結構:正則表達式從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正則表達式完全從文件中獲取位置標記及其內容?

謝謝!

+0

什麼?在stackoverflow上有很多答案,你不應該試圖用正則表達式來做HTML,但是在XML的情況下,它應該更加明顯。它是XML,爲什麼不使用簡單的XML讀取器而不是正則表達式? –

+1

我想指出,本網站上的大多數人在使用正則表達式處理HTML時只是喋喋不休。對於某些類型的刮擦,你沒有理由不這樣做。只有當您嘗試匹配需要保持計數的事物(如嵌套標記,括號等)時,纔會更好地使用DOM解析器。 – FtDRbwLXw6

+0

我需要使用正則表達式的原因有點複雜,但我基本上需要獲取現有的RSS文件,刪除它的那些部分,然後將其回顯出來,就好像它是原始RSS文件一樣。 – codeman

回答

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()); 
+0

這似乎是一個更好的解決方案。謝謝。 – codeman

0

免責聲明:爲了靈活性和可靠性,您應該始終使用適當的解析器,如DOMDocument來操作XML/HTML。也就是說,如果你確定你的標記是格式良好,不受變化結構的影響,並且不會包含嵌套的重複標籤,正則表達式可以通過解決這樣的問題。但是如果你知道自己在做什麼,你應該只使用它們。


你要使用preg_replace()與空字符串("")取代每個匹配。下面是它如何能爲<author>...</author>塊來完成:

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

基本上這個開始標記<author>,什麼都開始/結束標記和結束標記之間</author>(或沒有)相匹配。

其他標籤可以以類似的方式刪除。

+0

我如何才能使用媒體:內容標籤? – codeman

+0

@ sw333t:如上所述,對於多行,使用's'修飾符(例如「#regexpattern#s」)。請參閱[這裏](http://php.net/manual/en/reference.pcre.pattern.modifiers.php)瞭解它和其他修飾符的描述。 – FtDRbwLXw6

+0

啊,謝謝。有效! – codeman

3

不要使用正則表達式解析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(); 
+0

由於我在@ BerryLangerak的答案中所做的相同原因,我不同意「不要使用帶有XML/HTML的正則表達式」語句,但仍然以+1爲例。 – FtDRbwLXw6

+0

@drrcknlsn:正則表達式不是正確的工具。你可以在牆上鏟一顆釘子,但是你呢?不,相反,您使用正確的工具來完成這項工作。當預期的輸入變化甚微時,正則表達式可以被細分,而解析器將保持穩定,但最糟糕的情況是標記濫用。所以,不,我不同意這個評論,這也是我低估了你的答案的原因,對不起。這不是一個盲目的概念,它是基於個人和社區經驗的證明。 –

+0

允許我使用更好的比喻。將釘子釘入牆壁的「最佳」工具不是錘子。這是一款氣動釘槍。但是如果你只需要在牆上掛一張照片,你是不是要拿出一把氣動釘槍,把它放好,裝上墨盒,插上電源,然後射釘子?或者你是否要在牀頭櫃上拿起那本書,並釘上釘子?我知道我會使用哪一個。 :-) – FtDRbwLXw6

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)