有人可以为我提供一个正则表达式,它将替换括号之间的部分文本吗?
示例:我有字符串
123 (abc,def) 567
我想结束
123 (abc def) 567
所以基本上我想替换括号之间的“,”字符。
在此先感谢,我似乎忘记了我对正则表达式的大部分了解。
罗伯特
有人可以为我提供一个正则表达式,它将替换括号之间的部分文本吗?
示例:我有字符串
123 (abc,def) 567
我想结束
123 (abc def) 567
所以基本上我想替换括号之间的“,”字符。
在此先感谢,我似乎忘记了我对正则表达式的大部分了解。
罗伯特
这应该有效:
$s = '123 (abc,def) 567';
echo preg_replace('/(\([^)]*),([^)]*\))/', '$1 $2', $s);
有点干净,但很简单。
<?php
$string = '123 (abc,def) 567';
$string = preg_replace('!,!',' ',$string);
echo $string;
?>
输出是:
123 (abc def) 567
按照要求。
更新
为了平息投诉,另一个版本是:
$string = '123 (abc,def) 567';
$string = preg_replace('!([^,]+),(.+)!','$1 $2',$string);
echo $string;
另一个更新表明我们只删除括号之间的逗号
$string = '123 (abc,def) 567';
$string = preg_replace('!(\([^,)]+),(.+\))!','$1 $2',$string);
echo $string;
并不是说这是最初的问题,要替换括号之间的所有逗号,您可以这样做
$strings = array('123 (abc,def) 567','(),(zefzef)','(,abc)','(def,hij,nop,abc),(abc,) 123');
foreach($strings as $string){
echo "Before: $string = ";
while(preg_match('!(\([^,)]*),(.+\)?)!',$string)){
$string = preg_replace('!(\([^,)]*),(.+\)?)!',"$1 $2",$string);
}
echo "After: $string\n";
}
编辑:
如果你没有递归括号,这就像一个魅力:
/,(?=[^(]*?\))/
当然换成一个空格。
这适用于 PHP。(如果你可以使用 preg_replace_callback):
function commas($matches){return str_replace(',',' ',$matches[0]);}
echo preg_replace_callback('/(\(.*\))/i','commas','123 (abc,def) 567');
或在一行中:
echo preg_replace_callback('/(\(.*\))/i',create_function('$matches','return str_replace(","," ",$matches[0]);'),'123 (abc,def) 567');