2011-04-11 84 views
0

嗨, PHP變量$html持有下列對象...php preg_replace對象內的寬度和高度?

<object width="562" height="200"> 
    <param name="movie" value="http://www.youtube.com/v/rBa5qp9sUOY?version=3"> 
    <param name="allowFullScreen" value="true"> 
    <param name="allowscriptaccess" value="always"> 
    <embed src="http://www.youtube.com/v/rBa5qp9sUOY?version=3" 
     type="application/x-shockwave-flash" 
     width="562" 
     height="200" 
     allowscriptaccess="always" 
     allowfullscreen="true"> 
</object> 

任何想法我怎麼能篩選對象 - 和嵌入標籤的寬度和高度都擁有100%的值?

<object width="100%" height="100%"> 
    ... 
    <embed src="http://www.youtube.com/v/rBa5qp9sUOY?version=3" 
     type="application/x-shockwave-flash" 
     width="100%" 
     height="100%" 
     allowscriptaccess="always" 
     allowfullscreen="true"> 
</object>` 

感謝您的幫助!

更新:

$chunk = $dom->getElementsByTagName('body')->item(0); 

     $objectHtml = ''; 
     foreach($chunk->childNodes as $node) { 
      $objectHtml .= $node->saveXML(); 
     } 

     return $objectHtml; 

說:調用未定義的方法一個DOMElement :: saveXML()

而...

$dom = preg_replace('/^<!DOCTYPE.+?>/', '', str_replace(array('<html>', '</html>', '<body>', '</body>'), array('', '', '', ''), $dom->saveXML())); 

工作正常!不過我得到奇怪的
在我的源代碼中插入使用這個時候..

這樣的:

<!--?xml version="1.0" standalone="yes"?--> 
<br> 
<br> 
<object width="95%" height="75%"><param name="movie" value="http://www.youtube.com/v/rBa5qp9sUOY?version=3"><param name="allowFullScreen" value="true"><param name="allowscriptaccess" value="always"><embed src="http://www.youtube.com/v/rBa5qp9sUOY?version=3" type="application/x-shockwave-flash" width="95%" height="75%" allowscriptaccess="always" allowfullscreen="true"></object> 

任何想法,我在做什麼錯在這裏?

回答

5

修改HTML時,最好使用HTML解析器而不是正則表達式。

$dom = new DOMDocument; 

$dom->loadHTML($str); 

$object = $dom->getElementsByTagName('object')->item(0); 

$object->setAttribute('width', '100%'); 
$object->setAttribute('height', '100%'); 

$embed = $object->getElementsByTagName('embed')->item(0); 

$embed->setAttribute('width', '100%'); 
$embed->setAttribute('height', '100%'); 

echo $dom->saveXML($dom->getElementsByTagName('body')->item(0)); 

你可能不希望包裹在body的元素,所以做到這一點...

$objectHtml = ''; 
foreach($chunk->childNodes as $node) { 
    $objectHtml .= $dom->saveXML($node, LIBXML_NOEMPTYTAG); 
} 

哪裏$chunk$dom->getElementsByTagName('body')->item(0)

我加了選項LIBXML_NOEMPTYTAG,否則如果你有<span></span>它會變成<span />

如果使用> = PHP 5.3,請改爲使用saveHTML()

+0

像魚桶一樣,呃? – Charles 2011-04-11 06:29:40

+0

@Charles簡單嗎?我想這樣... :) – alex 2011-04-11 06:39:45

+0

+1使用可讀代碼,而不是(有時)令人困惑的正則表達式。對於不可預知的屬性排序,在這種情況下,代碼比正則表達式更簡單 – Liam 2011-04-11 06:51:04

-1
$html = '<object width="562" height="200"><param name="movie" value="http://www.youtube.com/v/rBa5qp9sUOY?version=3"><param name="allowFullScreen" value="true"><param name="allowscriptaccess" value="always"><embed src="http://www.youtube.com/v/rBa5qp9sUOY?version=3" type="application/x-shockwave-flash" width="562" height="200" allowscriptaccess="always" allowfullscreen="true"></object>'; 

$pattern = '/(<object[^>]*width=)\".*?(\"[^>]*height=)\".*?(\"[^>]*>.*?<embed[^>]*width=)\".*?(\"[^>]*height=)\".*?(\"[^>]*>.*?<\/object>)/si'; 
$replace = '\1"100\2"200\3"300\4"400\5'; 
echo preg_replace($pattern, $replace, $html); 

這應該有效。 將100,200,300,400設置爲您的值。

+0

當「width」和「height」屬性的順序相反時,它不起作用。 – minhee 2011-04-11 06:30:13

0
preg_replace('/(width|height)(=)"([\d]+)"/', '${1}${2}"100%"', $html); 

這應該做的伎倆:)

0

這就是全部,你的字符串將包含哪些內容?如果是這樣,你可以使用這個:

$replace = preg_replace(
      "/(width|height)=\".*?\"/", 
      "\${1}=\"100%\"", 
      $html 
     ); 

你可以調整的格局,允許屬性,=標誌和值作爲必要之間的空白。

如果您的字符串將包含更多HTML,並且您不想替換它們自己的寬度/高度屬性,那麼您將需要更強大的解決方案。