【问题标题】:preg_replace attribute valuespreg_replace 属性值
【发布时间】:2011-03-16 20:57:20
【问题描述】:

所以我有一个有效的 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() 函数中使用相同的模式,它将删除整个 &lt;object&gt; 标记。我需要用其他任何东西替换 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);

没有这个改变,第一个函数替换了宽度,但是它取出了标签中之后的每个属性。

感谢 Tim 的解决方案!

【问题讨论】:

  • 您希望使用适当的 HTML 解析器来解析 HTML。
  • @Pekka,感谢您的链接,老实说,对于这样一个相对较小的任务来说,这似乎是太多的开销。我明白你在说什么(并且该线程信息量很大),但我认为这种特殊情况最好使用一行 preg_replace 来解决。

标签: php regex preg-replace


【解决方案1】:

你需要捕获匹配围绕要替换的字符串:

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

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

【讨论】:

  • 不错!非常感谢 - 我将如何使用上述设置不同的宽度和高度值?
  • 你需要两个正则表达式。我首先认为您可以使用带有回调的单个正则表达式来做到这一点,但是由于每个标签都包含两个值,并且正则表达式与整个标签匹配,因此您需要按顺序执行。
  • 非常感谢蒂姆。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-31
  • 1970-01-01
相关资源
最近更新 更多