5

正規表現を Ruby から PHP に変換しようとしていますが、うまくいきませんでした。

これはルビの正規表現です:

QUOTED_LITERAL = /"[^"\\]*(?:\\.[^"\\]*)*"/
UNQUOTED_LITERAL = /[^\s=,][^\s=,\\]*(?:\\.[^\s=,\\]*|=[^,>])*/
LITERAL = /(#{QUOTED_LITERAL}|#{UNQUOTED_LITERAL})/
PAIR = /#{LITERAL}\s*=>\s*#{LITERAL}/

そして、これはPHPでの私の行き方です:

 const PAIR = '/("[^"\\]*(?:\\.[^"\\]*)*"|[^\s=,][^\s=,\\]*(?:\\.[^\s=,\\]*|=[^,>])*)\s*=>\s*("[^"\\]*(?:\\.[^"\\]*)*"|[^\s=,][^\s=,\\]*(?:\\.[^\s=,\\]*|=[^,>])*)/';

しかし、私が走るとき

$result = preg_match_all(self::PAIR, $input, $matches);

エラーが発生します:

preg_match_all(): Compilation failed: unmatched parentheses at offset 62


ただし、http://www.phpliveregex.com/をテスト データとともに実行すると、次のようになります。

"foo" => "bar", "foo" => bar, foo => "bar"

それはうまくいくようです。

何が起こっているのかわからない。

4

1 に答える 1

3

問題はバックスラッシュにあります。

すべてのバックスラッシュを削除した後、なんとかコンパイルできました。

次に、すべての二重スラッシュを 4 つに置き換えpreg_match_all()、正規表現もコンパイルできました。

const PAIR = '/("[^"\\\\]*(?:\\\\.[^"\\\\]*)*"|[^\s=,][^\s=,\\\\]*(?:\\\\.[^\s=,\\\\]*|=[^,>])*)\s*=>\s*("[^"\\\\]*(?:\\\\.[^"\\\\]*)*"|[^\s=,][^\s=,\\\\]*(?:\\\\.[^\s=,\\\\]*|=[^,>])*)/';

必要な正確な正規表現を取得するには、編集する必要がある場合があります。\\として正規表現エンジンにフィードされたため、コンパイル エラーが発生しまし\た。\\\\リテラル バックスラッシュをエンコードするには、文字列用に 1 回、正規表現エンジン用に 1 回 -を使用する必要があります。

string '\\\\'  --becomes--> regex \\ --becomes--> literal \

Ruby では、正規表現構文が文字列構文とは別であるため、この問題はありません。

(関連する質問: preg_match(): コンパイルに失敗しました: 括弧が一致しません。)

于 2013-08-20T03:27:11.517 に答える