0

我在 SO 上找到了与我当前需求类似的答案,但是我仍在尝试根据规则掌握修改字符串,除非在这些字符串中的某些附件中。

我现在尝试完成的示例:

preg_replace("/\s*,\s*/", ",", $text)

我在很多地方都找到了上述内容。它将删除字符串中所有逗号前后的空格。

这很好用。但是,如果我想排除在“”中找到的修改逗号,我不确定如何修改该规则。

有什么帮助吗?谢谢!

编辑:我想澄清我的问题:我希望删除以下句子中逗号前后的所有空格,但双引号或单引号中的逗号除外:

a, b , c "d, e f g , " , h i j ,k lm,nop

预期结果:

a,b,c "d, e f g , ",h i j,k lm,nop
4

2 回答 2

2

http://ideone.com/bRlYz

$text = '"a"   ,      "   , b"';

$result = preg_replace("/(?<=\")\s*,\s*(?=\")/", ",", $text);

var_dump($result);

但如果你有这样的情况,它会失败:" , "- 逗号的空格用引号括起来并且没有任何其他字符

于 2012-04-09T22:57:31.180 回答
1

我认为这可能有效(它替换了“/”之外的空格,但不是那些里面的空格):

function yourFunction($string) {
    $arr = explode('"',str_replace(' ','@',$string));

    if (preg_match('~^("|\')~',$string)) {
    foreach ($arr as $key=>$value) {
        if (($key % 2) != 0) {
        $arr[$key] = preg_replace('~\s*,\s*~',',',str_replace('@',' ',$value));
    }
    }
    } else {
    foreach ($arr as $key=>$value) {
        if (($key % 2) == 0) {
        $arr[$key] = preg_replace('~\s*,\s*~',',',str_replace('@',' ',$value));
        }
    }
    }
    $newString = implode('"',$arr);
    $newString = str_replace('@',' ',$newString);

    return $newString;
}

@ 是空格的占位符。(所以没有空格可以丢失,我不知道我为什么这样做,我只知道没有那个我会遇到问题)

"if (preg_match"-construct 检查你的字符串是否以 "/' oder with sth 开头。否则用于 foreach 中的逻辑。

如果字符串以 "/' 开头,则每个第二个条目都在 2 "/' 内,否则其他条目。

希望这就是你要找的

于 2012-04-09T23:53:15.290 回答