PHP: regexp用于替换括号之间的部分文本(逗号)


PHP: regexp to replace partial text (comma) between parenthesis

有人可以为我提供一个regexp,这将取代括号之间的文本的一部分?

示例:我有字符串

    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";
}

Edit:
如果没有递归括号,这将非常有用:

/,(?=[^(]*?'))/

当然是用空格代替

这在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');

请检查此正则表达式。这对你有帮助。

,(?=[^'(]*'))

检查演示