preg_replace 属性值

bob*_*oap 0 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];
Run Code Online (Sandbox Code Playgroud)

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

任何帮助深表感谢。

编辑:蒂姆的解决方案如下

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

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

如果没有这个更改,第一个函数会替换宽度,但它会删除标签中之后的所有属性。

感谢蒂姆的解决方案!

Tim*_*ker 5

您需要捕获要替换的字符串周围的匹配项:

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

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