2009-12-18 137 views
0

比方說,我有這樣的字符串: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); 

這是不完全正確的,因爲搜索是貪婪的。

想法?

謝謝!

回答

2

試試這個:

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

注意:未經測試

我所做的是改變*爲* ?,並關閉了你的對象標記(我認爲這可能是一個錯誤;對不起,如果這是不正確的)。這個? 。*之後應該讓它很懶。

0

使用$2作爲下一個括號。

0

我們可以通過使用*來使搜索非貪婪?代替*。所以,最終的正則表達式就變成了:

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

我還添加「>」在表達式的末尾,以便從替換文本來避免它。

1

那麼爲什麼不這樣做水木清華這樣的:

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

或者這樣:

$text = preg_replace("@<object>[email protected]", "%ITEM:", $text); 
$text = preg_replace("@</object>@", "", $text); 

注:測試=)

0

那豈不是更容易在分割字符串「」的每個實例?

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