2011-06-29 10 views
1

私はpreg_splitを使用していくつかの値を持つ配列を作成しています。 'This * Value'のような値がある場合、preg_splitは値の*のために値を配列( 'This'、 'Value')に分割しますが、指定した場所に分割したい*値から*どのように値をエスケープすることができますので、文字列のシンボルは式に影響を与えませんか?正規表現をエスケープする正規表現

例:

// Cut into {$1:$2} 
$str = "{Some:Value*Here}"; 
$result = preg_split("/[\{(.*)\:(.*)\}]+/", $str, -1, PREG_SPLIT_NO_EMPTY); 

// Result: 

Array(
    'Some', 
    'Value', 
    'Here' 
); 

// Results wanted: 

Array(
    'Some', 
    'Value*Here' 
); 
+0

あなたはより特異的であることができる、それが大幅に簡略化することができるので、文字クラス内のほとんどの特殊文字は、文字通りに扱われますか?ストリングとは何ですか?ストリングは何に分割したいですか? –

+0

split regexで '*'を使わないでください。あるいは、 '*'を区切り文字として使いたいだけでなく、文字列の中の個々の値の中でも使えるようにすることを意味しますか? –

+0

はい、Marc B.は*で分割するだけでなく、値を分割することなく値で使用します。 –

答えて

2

あなたの現在の正規表現は少し...野生です。

$str = "{Some:Value*Here}"; 
$result = preg_split("/[{}:]+/", $str, -1, PREG_SPLIT_NO_EMPTY); 

そして今$resultは、次のようになります:

array(2) { 
    [0] => string(4) "Some" 
    [1] => string(10) "Value*Here" 
} 
3

[]は、文字クラスとして解釈されているので、その中の任意の文字が一致します。これを試してみてください。ただし、分割しないでください。preg_matchを使用して、マッチしたグループを探します。 (OPの問題には適用されません)

"/(\{([^:]*)\:([^:]*)\})+/" 

オリジナルの答え:あなたはthis\*valueのような\で自分の価値観で*をエスケープしたい場合

は、あなたがこの正規表現に分割することができます:

(?<!\\)\* 
+0

これは動作しません.. あなたのコードは です。$ str = '{テスト}:{asd} {asd}:{12 * 3}'; エコー "

"; preg_match("/(\{(.*)\}\:\{(.*)\})+/", $str, $matches); print_r($matches); echo "
"; ' 結果: 'アレイ ( [0] => {試験}:{ASD} {ASD}:{12 * 3} [1] => {試験} {ASD } {asd}:{12 * 3} [2] =>テスト}:{asd} {asd [3] => 12 * 3 ) ' –

2

問題に対する正しい、最も安全な解決策はpreg_quoteです。文字列に引用符で囲まない文字が含まれている場合は、引用後にstr_replaceを返す必要があります。