所以我有一个工作的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);
如果没有这个更改,第一个函数会替换宽度,但它会在标记之后取出每个属性。
感谢蒂姆的解决方案!
答案 0 :(得分:4)
您需要捕获围绕要替换的字符串:
由于您要将height
和width
替换为不同的值,因此需要两个正则表达式,按顺序应用:
$interm = preg_replace('/(<*[^>]*width=)"[^>]+"([^>]*>)/', '\1"200"\2', $subject);
$result = preg_replace('/(<*[^>]*height=)"[^>]+"([^>]*>)/', '\1"300"\2', $interm);