preg_replace属性值

时间:2011-03-16 20:57:20

标签: php regex preg-replace

所以我有一个工作的preg_match模式用于在字符串中查找HTML属性的值,我需要对preg_replace执行相同的操作 - 找不到并返回值,而是将其替换为新值。

但如果我只使用preg_match模式它就行不通了......我被卡住了。

以下是代码:

    $string = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" 
width="437" height="288" id="viddler">
<param name="movie" value="http://www.viddler.com/player/1234567890/" />
<param name="allowScriptAccess" value="always" />
<param name="allowFullScreen" value="true" />
<param name="flashvars" value="fake=1"/>
<embed src="http://www.viddler.com/player/1234567890/" 
width="437" height="288" type="application/x-shockwave-flash" 
allowScriptAccess="always" allowFullScreen="true" flashvars="fake=1" 
name="viddler" ></embed></object>';

preg_match("|<*[^>]*width=\"([^>]+)\"[^>]*>|Ui", $string, $results);

echo 'Width: '.$results[1];

这样可以返回437。如果我在preg_replace()函数中使用相同的模式,它将删除整个<object>标记。我需要用其他任何东西替换那个437,比如200.当我们在它时,我也需要替换高度值。最后,这应该适用于任何嵌入代码或iframe,因此它应该分别只查找width="height=" ...就像上面的preg_match示例一样。

非常感谢任何帮助。

编辑: Tim的解决方案

我让蒂姆的模式进行了一些小修改:

$interm = preg_replace('|(<*[^>]*width=)"[^>]+"([^>]*>)|Ui', '\1"200"\2', $string);
$result = preg_replace('|(<*[^>]*height=)"[^>]+"([^>]*>)|Ui', '\1"300"\2', $interm);

如果没有这个更改,第一个函数会替换宽度,但它会在标记之后取出每个属性。

感谢蒂姆的解决方案!

1 个答案:

答案 0 :(得分:4)

您需要捕获围绕要替换的字符串:

由于您要将heightwidth替换为不同的值,因此需要两个正则表达式,按顺序应用:

$interm = preg_replace('/(<*[^>]*width=)"[^>]+"([^>]*>)/', '\1"200"\2', $subject);
$result = preg_replace('/(<*[^>]*height=)"[^>]+"([^>]*>)/', '\1"300"\2', $interm);