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

PHP:regexp替换括号之间的部分文本(逗号),php,regex,preg-replace,Php,Regex,Preg Replace,有人能给我提供一个regexp来替换括号之间的部分文本吗 示例:我有字符串 123 (abc,def) 567 我想和你在一起 123 (abc def) 567 基本上我想替换括号中的“,”字符 提前感谢,我似乎已经忘记了我所知道的关于正则表达式的大部分内容 罗伯特这应该行得通: $s = '123 (abc,def) 567'; echo preg_replace('/(\([^)]*),([^)]*\))/', '$1 $2', $s); 这应该起作用: $s =

有人能给我提供一个regexp来替换括号之间的部分文本吗

示例:我有字符串

    123 (abc,def) 567
我想和你在一起

    123 (abc def) 567
基本上我想替换括号中的“,”字符

提前感谢,我似乎已经忘记了我所知道的关于正则表达式的大部分内容

罗伯特

这应该行得通:

$s = '123 (abc,def) 567';

echo preg_replace('/(\([^)]*),([^)]*\))/', '$1 $2', $s);
这应该起作用:

$s = '123 (abc,def) 567';

echo preg_replace('/(\([^)]*),([^)]*\))/', '$1 $2', $s);

有点干净,但很简单

<?php
$string = '123 (abc,def) 567';

$string = preg_replace('!,!',' ',$string);

echo $string;

?>
按要求

更新

为了平息投诉,另一个版本是:

$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
$string = '123 (abc,def) 567';

$string = preg_replace('!,!',' ',$string);

echo $string;

?>
按要求

更新

为了平息投诉,另一个版本是:

$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_回调):

或者在一行中:

echo preg_replace_callback('/(\(.*\))/i',create_function('$matches','return str_replace(","," ",$matches[0]);'),'123 (abc,def) 567');
这在PHP中工作。(如果可以使用preg_replace_回调):

或者在一行中:

echo preg_replace_callback('/(\(.*\))/i',create_function('$matches','return str_replace(","," ",$matches[0]);'),'123 (abc,def) 567');

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

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

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

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

括号内是否有多个逗号,您需要全部替换?如果是这样,我认为你不可能一步到位。您必须拉出括号之间的文本,替换所有逗号(用普通的
str_replace
),然后替换原始字符串中的逗号。@user13955是否有递归括号?括号内是否有多个逗号,您需要全部替换?如果是这样,我认为你不可能一步到位。您必须拉出括号之间的文本,替换所有逗号(用普通的
str_replace
),然后替换原始字符串中的逗号。@user13955是否有递归括号?这也将替换括号外的逗号。这不会检查括号,也可以是
$string=str_replace(“,”,“,$string”)@Barmar他在最初的请求中没有这么说。他提到的括号只是他想要发生的事情的英文描述。@Kolink你不能假设他会根据这个问题输出任何需要逗号(比如数组)的东西。感谢-1的正确回答。他的问题清楚地说“替换括号之间的一部分文字”。他的示例在括号外没有逗号这一事实并不能否定这一点。这也将替换括号外的逗号。这不会检查括号,最好是
$string=str_replace(“,”,“,”,$string)@Barmar他在最初的请求中没有这么说。他提到的括号只是他想要发生的事情的英文描述。@Kolink你不能假设他会根据这个问题输出任何需要逗号(比如数组)的东西。感谢-1的正确回答。他的问题清楚地说“替换括号之间的一部分文字”。他的例子在括号外没有逗号这一事实并不能否定这一点。不,不应该。(),(zefzef)将匹配。不,不应该。(),(zefzef)将被匹配。
*
需要在分组括号内。是的,当然,无论如何,如果他可以有递归括号,它将不起作用。
*
需要在分组括号内。是的,当然,无论如何,如果他可以有递归括号,它将不起作用。