正则表达式 - 修改除指定的机箱外的字符串 - PHP

时间:2012-04-09 22:51:33

标签: php regex

我已经在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

2 个答案:

答案 0 :(得分:2)

http://ideone.com/bRlYz

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

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

var_dump($result);

但是当你有这样的事情时它会失败:" , " - 用逗号括起来但没有任何其他字符的空格

答案 1 :(得分: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开头,而对于foreach中的逻辑,是否为其他。

如果字符串以“/”开头,则每个第二个条目在2“/”之内,否则为其他条目。

希望这就是你要找的东西