0

私は正規表現の初心者です。私は次の正規表現を持っています:

/(?:"\s*or\s*"?\d)|(?:\\x(?:23|27|3d))|(?:^.?"$)|(?:(?:^["\\]*(?:[\d"]+|[^"]+"))+\s*(?:n?and|x?or|not|\|\||\&\&)\s*[\w"[+&!@(),.-])|(?:[^\w\s]\w+\s*[|-]\s*"\s*\w)|(?:@\w+\s+(and|or)\s*["\d]+)|(?:@[\w-]+\s(and|or)\s*[^\w\s])|(?:[^\w\s:]\s*\d\W+[^\w\s]\s*".)|(?:\Winformation_schema|table_name\W)\

この正規表現をここで実行すると、非常にうまく機能します。しかし、preg_matchを使用して php スクリプトで実行すると、次のように表示されます

Warning: preg_match(): Compilation failed: unmatched parentheses at offset 129 in...

これらは、この正規表現が必要なパターンのいくつかの例です。

"\ 26" && [
"\ 26" && +
"\ 26" && &
"\ 26" && !
"\ 26" && @
"\ 26" && (
"\ 26" && )

正規表現の構造を変更したくありません。エラーなしで実行するためにPHP関数を知る必要があり、その結果、上記の例を見つけることができます。前もって感謝します。

4

3 に答える 3

0

括弧をリテラルとして使用する場合は、エスケープする必要があります。だから[+&!@(),.-]使用する代わりに[+&!@\(\),.-]

エスケープされていない括弧を使用した場合の動作は、regex-enigne と regex-engine で異なるため、regex101 と php の違いを説明できます。

編集:[+&!@(),.-]かっこが角かっこで囲まれているため、ほとんどの標準では機能するはずですが、それらをエスケープすることは少なくとも試してみる価値があります。

于 2013-11-11T09:02:05.647 に答える
0

そこで、試行錯誤を繰り返しました。私は正規表現の専門家ではありませんが、いくつか絞り込みました。あなたはたくさんのORステートメントを持っている(str1)|(str2)ので、PHPが1つ捨てるまで文字列を切り始めました

preg_match('/(?:(?:^["\\]*(?:[\d"]+|[^"]+"))+\s*(?:n?and|x?or|not|\|\||\&\&)\s*[\w"[+&!@(),.-])/', $str, $matches);

それが生み出しCompilation failed: unmatched parentheses at offset 80た。だから私たちには犯人がいます。しかし、その理由はもう少しとらえどころのないものです。私はそれをhttp://regex101.comにポップしましたが、問題はありませんでしたが、PHP は文字クラスでそれを失っています[\w"[+&!@(),.-]

私が言えることは、パターンの開始に別の括弧を追加したことだけです。それは機能します...ちょっと

$str = '"\ 26" && [';
preg_match('/((?:(?:^["\\]*(?:[\d"]+|[^"]+"))+\s*(?:n?and|x?or|not|\|\||\&\&)\s*[\w"[+&!@(),.-])/', $str, $matches);
var_dump($matches);

出す

array(2) {
  [0]=>
  string(11) ""\ 26" && ["
  [1]=>
  string(11) ""\ 26" && ["
}

おそらくさらにデバッグが必要ですが、正規表現自体に問題があるとは言えません。たぶん、 PHP バグを開いてみてください。

于 2013-11-11T04:42:09.160 に答える