2010-12-27 6 views
0

私は、次のパターンが動作するキャラクターのグループを否定しても否定グループ内ネゲートキャラクターグループ:マッチ「ABC「」ではなく「のABC 」、」

をキャラクターを否定することができ、パターンが必要ですが、私は、もう少しやりたい

ここ
(?:(?!'\,).)+ 

私は「を含む文字列を一致させる必要はありません、

しかし、私は本当に否定グループ内の否定統合することです必要なもの - この

ような何かを
(?:(?![^\\]'\,).)+ 
私は任意の引用エスケープ一致したくない

が署名

マッチ:abc',

が一致しない:abc\',


なんてこったが...それが入力した上でポスト..

$str = "'abc\',',asdf"; 
preg_match("/^('(?:(?!',).)+')/", $str, $matches); 
echo '<pre>'; 
print_r($matches); 
echo '</pre>'; 

これは、出力する必要がありますabc\',でも出力しますがabc\

答えて

1

あなたの最後のコメントで判断すると、一重引用符がバックスラッシュでエスケープされている可能性がある一重引用符の文字列リテラルと一致させようとしていると思います。たとえば、この文字列で:

'abc\',','xyz' 

...あなたは'abc\',''xyz'をマッチさせたいです。

$source = "'abc\',','xyz'"; 
print "$source\n\n"; 
preg_match_all("/'(?:[^'\\\\]++|\\\\.)*+'/", $source, $matches); 
print_r($matches); 

出力:

'abc\',','xyz' 

Array 
(
[0] => Array 
    (
     [0] => 'abc\',' 
     [1] => 'xyz' 
    ) 

) 

see it on ideone

しかし、多分あなたは、または引用されても、しなくてもよいカンマ区切りリスト内のすべての項目をマッチさせたいそれは簡単に十分ですつまり、CSV(またはそれに近いもの)です。その場合は、専用のCSV処理ツールを使用する必要があります。そこには多くの人がいます。実際、PHPには次のものが組み込まれています:http://php.net/manual/en/function.fgetcsv.php

+0

それは動作します! :)しかし、preg_matchとpreg_match_allの違いは何ですか? – clarkk

+0

'preg_match'は1つのマッチを探して停止しますが、' preg_match_all'はすべての可能な重複しないマッチを見つけるまで続行します。 'preg_match_all'を' preg_match'に変更すると、 '' abc \ '、' ' –

1

/^(?:(?!\\\\',).)+$/のように表示されます。一重引用符''をエスケープする必要があることに注意してください。 http://ideone.com/ypln2

必ずしも完全な文字列と一致させる必要がない場合は、^$を削除してください。 http://ideone.com/G67RV

+0

それは動作していないようです。 – clarkk

+0

@userそれがうまくいかない例を挙げてください。 – marcog

+0

<? $ str = "'abc \'、 '、asdf"; preg_match( "/^('(?)(?!,,).)+'))"、$ str、$ matches); エコー '

'; print_r($matches); echo '
'; ?> – clarkk

関連する問題