php preg_replace对象里面的宽度和高度?

时间:2011-04-11 06:23:03

标签: php regex preg-replace

嘿伙计们, php变量$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>

任何想法如何过滤object-embed-embed-tag的宽度和高度以获得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>

知道我在这里做错了什么?

4 个答案:

答案 0 :(得分: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 />

如果使用&gt; = PHP 5.3,请改用saveHTML()

答案 1 :(得分:0)

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

应该这样做:)

答案 2 :(得分:0)

这就是你的字符串包含的全部内容吗?如果是这样,你可以使用它:

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

您可以根据需要调整模式以允许属性=符号和值之间的空格。

如果您的字符串包含更多HTML,并且您不想更换自己的宽度/高度属性,那么您将需要更强大的解决方案。

答案 3 :(得分:-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。