2011-04-11 87 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,并且您不想替换它们自己的宽度/高度属性,那么您将需要更强大的解决方案。