2012-09-14 56 views
0

我需要将“,”替换为“enoComma”,但仅限于位于括号内的内容< ...>。
我试图像这样做,但它取代括号内只有第一个逗号如何使用preg_replace替换括号内的逗号

$text = 'asd, asd <asd, asd, adasd> ... '; 
preg_replace_callback("/(<.*?),(.*?>)/", 
    create_function('$m', 'return $m[1].\'enoComma\'.$m[2];'), 
    $text 
); 
echo $text; // asd, asd <asdenoComma asd, adasd> ... 
+0

我该怎么办? –

回答

1

我想这应该这样做:

$text = 'asd, asd <asd, asd, adasd> ... <a,b,c>'; 

function replace_function($s) { 
    return str_replace(",", "enoComma", $s[0]); 
} 

$text = preg_replace_callback("|<(.*)>|", "replace_function", $text); 

echo "$text\n"; 

输出:

asd, asd <asdenoComma asdenoComma adasd> ... <aenoCommabenoCommac> 
+0

谢谢!有用!但是我注意到表达式“|(<.*>)|”。再次感谢你! –

1

既然你已经在使用preg_replace_callback我会让它取出括号内的所有内容,然后让回调代替enoComma中的每个逗号。

<?php 
$text = 'asd, asd <asd, asd, adasd> asd, asd asd, asd <x, y, z> asd'; 
$text = preg_replace_callback('/(?<=<)[^<>]+(?=>)/', function($e) { 
    return str_replace(',', 'enoComma', $e[0]); 
}, $text); 
echo $text; 

打印

asd, asd <asdenoComma asdenoComma adasd> asd, asd asd, asd <xenoComma yenoComma z> asd 

但请记住,这将不会像a,b<c,d<e,f>>
嵌套括号工作的例子使用的lambda function,而不是create_function

+0

正确的,嵌套的括号可能会有不需要的行为。 'a,b >'会变成'a,b >',但更糟的是:'a,b ,abc>'=>'a,b ,abc>'(note abc之前的逗号不会被取消!) – SDwarfs