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は、文字列が「/」またはsthで始まるかどうかをチェックします。elseはforeachのロジックを表します。

文字列が「/」で始まる場合、2番目のエントリはすべて2「/」の内側にあります。それ以外の場合は他のエントリです。

それがあなたが探しているものであることを願っています

于 2012-04-09T23:53:15.290 に答える