PHP - 具有多个匹配项的preg_replace

时间:2009-12-18 04:49:18

标签: php preg-replace

假设我有一个字符串:

$text = "<object>item_id1a2b3</object>xxx<object>item_id4c5d6</object>"

我想将其转换为:     %ITEM:1a2b3xxx%ITEM:4c5d6

这就是我所拥有的:

$text = preg_replace("/<object.*item_id([a-zA-Z0-9]+).*<\/object/","%ITEM:$1",$text);

这不太对,因为搜索很贪婪。

思想?

谢谢!

5 个答案:

答案 0 :(得分:2)

试试这个:

$text = preg_replace("/<object>.*?item_id([a-zA-Z0-9]+).*?<\/object/","%ITEM:$1",$text);

注意:未经测试

我所做的是将。*改为。* ?,并关闭你的对象标签(我认为这可能是一个错误;对不起,如果这不正确)。的?在。*之后应该让它变得懒惰。

答案 1 :(得分:1)

那么为什么不这样做呢:

$text = preg_replace("@<object>item_id([a-zA-Z0-9]+)</object>@", "%ITEM:$1", $text);

或者像这样:

$text = preg_replace("@<object>item_id@", "%ITEM:", $text);
$text = preg_replace("@</object>@", "", $text);

注意:已测试=)

答案 2 :(得分:0)

$2用于下一个括号。

答案 3 :(得分:0)

我们可以使用*来使搜索非贪婪吗?代替*。所以最终的正则表达式成为:

$text = preg_replace("/<object.*?item_id([a-zA-Z0-9]+).*?<\/object>/","%ITEM:$1",$text);

我还添加了'&gt;'在正则表达式的末尾,以避免它进入被替换的文本。

答案 4 :(得分:0)

在每个“”的实例上拆分字符串会不会更容易?

$result = '';
$items = explode('<object>', $text);
foreach ($items as $item){
  $result .= '%'.str_replace('</object>', '', $item);
}
echo $result;