2

少し長くなる正規表現があり、複数行にまたがると読みやすくなります。

私はこれを試しましたが、それはただのバーフです。

preg_match(
    '^J[0-9]{7}:\s+
    (.*?)             #Extract the Transaction Start Date msg
    \s+J[0-9]{7}:\s+Project\sname:\s+
    (.*?)             #Extract the Project Name
    \s+J[0-9]{7}:\s+Job\sname:\s+
    (.*?)             #Extract the Job Name
    \s+J[0-9]{7}:\s+',
    $this->getResultVar('FullMessage'),
    $atmp
);

上記の形式の正規表現を preg_match に渡す方法はありますか?

4

5 に答える 5

5

拡張構文を使用できます。

preg_match("/
    test
/x", $foo, $bar);
于 2008-08-22T14:54:20.267 に答える
3

はい、/x パターン修飾子を追加できます。

この修飾子は、Perlと互換性のないPCREの追加機能をオンにします。特別な意味を持たない文字が後に続くパターンのバックスラッシュはエラーを引き起こすため、将来の拡張のためにこれらの組み合わせを予約します。デフォルトでは、Perlの場合と同様に、バックスラッシュの後に特別な意味のない文字が続く場合は、リテラルとして扱われます。現在、この修飾子によって制御される他の機能はありません。

あなたの例のためにこれを試してください:

preg_match('/
              ^J[0-9]{7}:\s+
              (.*?)             #Extract the Transaction Start Date msg
              \s+J[0-9]{7}:\s+Project\sname:\s+
              (.*?)             #Extract the Project Name
              \s+J[0-9]{7}:\s+Job\sname:\s+
              (.*?)             #Extract the Job Name
              \s+J[0-9]{7}:\s+
            /x', $this->getResultVar('FullMessage'), $atmp);
于 2008-08-22T14:59:36.353 に答える
1

OK、ここに解決策があります:

preg_match(
                '/(?x)^J[0-9]{7}:\s+
                (.*?)             #Extract the Transaction Start Date msg
                \s+J[0-9]{7}:\s+Project\sname:\s+
                (.*?)             #Extract the Project Name
                \s+J[0-9]{7}:\s+Job\sname:\s+
                (.*?)             #Extract the Job Name
                \s+J[0-9]{7}:\s+/'
                , $this->getResultVar('FullMessage'), $atmp);

キーは先頭の(?x)で、これにより空白が重要ではなくなり、コメントが可能になります。

また、引用符の開始と終了、および正規表現の開始と終了の間に空白がないことも重要です。

このような私の最初の試みはエラーを出しました:

preg_match('
                /(?x)^J[0-9]{7}:\s+
                (.*?)             #Extract the Transaction Start Date msg
                \s+J[0-9]{7}:\s+Project\sname:\s+
                (.*?)             #Extract the Project Name
                \s+J[0-9]{7}:\s+Job\sname:\s+
                (.*?)             #Extract the Job Name
                \s+J[0-9]{7}:\s+/
           ', $this->getResultVar('FullMessage'), $atmp);

コンラッドが言ったことも機能し、最初に固執するよりも少し簡単に感じます (?x)

于 2008-08-22T14:54:40.063 に答える
1
  • 区切り記号を追加する必要があります。正規表現の最初の文字は、パターンの終わりを示すために使用されます。
  • 「x」フラグを追加する必要があります。これは、先頭に (?x) を置くのと同じ結果になりますが、読みやすくなります。
于 2008-08-22T14:56:57.233 に答える
0

PHP では、コメントの構文は次のようになります。

(?# コメントはこちら)

preg_match('
            ^J[0-9]{7}:\s+
            (.*?)             (?#Extract the Transaction Start Date msg)
            \s+J[0-9]{7}:\s+Project\sname:\s+
            (.*?)             (?#Extract the Project Name)
                \s+J[0-9]{7}:\s+Job\sname:\s+
            (.*?)             (?#Extract the Job Name)
            \s+J[0-9]{7}:\s+
            ', $this->getResultVar('FullMessage'), $atmp);

詳細については、PHP 正規表現構文リファレンスを参照してください。

Mark が例で示しているように、PCRE_EXTENDED (または「x」)パターン修飾子を使用することもできます。

于 2008-08-22T14:56:35.707 に答える