假设我有一个字符串:
$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);
这不太对,因为搜索很贪婪。
思想?
谢谢!
答案 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;