2011-06-05 50 views
0

我在我的數據庫中有一段文本。例如:跨度正則表達式替換

Dummy Text Here... 
<span class="youtube">nmkW544sK9U</span> 

Dummy Text Here... 
<span class="youtube">yUBKZvq5G2g</span> 

...我需要用它來代替:

Dummy Text Here... 
<iframe width="640" height="395" frameborder="0" allowfullscreen="" src="http://www.youtube.com/embed/nmkW544sK9U?rel=0"></iframe> 

Dummy Text Here... 
<iframe width="640" height="395" frameborder="0" allowfullscreen="" src="http://www.youtube.com/embed/yUBKZvq5G2g?rel=0"></iframe> 

但我不知道正則表達式不夠好,請你們幫我。

回答

0

東西沿着這些路線應該工作。

$replacement = '<iframe width="640" height="395" frameborder="0" allowfullscreen="" src="http://www.youtube.com/embed/$1?rel=0"></iframe>'; 
preg_replace('/<span class="youtube">(\w+)<\/span>/', $replacement, $string); 
1

作爲一般規則,不要使用正則表達式來解析HTML。它會導致你痛苦。

最好的方法是使用真正的DOM解析器。 PHP的DOMDocument是理想的。

例如:

$dom = new DOMDocument; 
$dom->loadHTML($yourHTML); 

$xpath = new DOMXPath($dom); 

$nodes = $xpath->query('//span[@class="youtube"]'); 

while ($node = $nodes->item(0)) { 
    $iframe = $dom->createElement('iframe'); 
    $iframe->setAttribute('width', 640); 
    $iframe->setAttribute('height', 395); 
    $iframe->setAttribute('frameborder', 0); 
    $iframe->setAttribute('allowfullscreen', ''); 
    $iframe->setAttribute('src', 'http://www.youtube.com/embed/' . $node->nodeValue . '?rel=0'); 

    $node->parentNode->replaceChild($iframe, $node); 
} 

$yourHTML = $dom->saveHTML(); 
+0

也許你可以解釋爲什麼正則表達式是如此痛苦?對於更復雜的操作,我同意你的看法,但對於這樣一個簡單的替換,我看不出任何問題? – Arend 2011-06-05 21:52:52

+0

@Arend這可能很好。直到源更改。或者它稍微複雜一些。如果模式是絕對確定的,那麼它可能會好起來 - 但是如果它稍有變化,就會被塞滿。 – lonesomeday 2011-06-05 21:55:11

+0

@Arend正則表達式無法輕鬆處理標籤嵌套。除非您確定靜態標籤嵌套,否則就是這個問題。 – millebii 2011-06-05 21:56:36