0

ファイル名:

forms.it.yml
validators.en.xliff

(ファイル名から)3つの部分を抽出する必要がある<domain>.<locale>.<format>ため、次の正規表現になりました:

/^(?P<domain>\.+).(?P<locale>\w{2,}).(?P<format>\w+)$/

しかし、もちろんうまくいきません。私が見逃している明らかな何かがあるはずです。

$match = '/^(?P<domain>\.+).(?P<locale>\w{2,}).(?P<format>\w+)$/';
$subject = 'forms.it.yml';

var_dump(preg_match($match, $subject)); // 0
4

2 に答える 2

1

ドットはあなたのパターンで特別です。角かっこで囲むか、またはスラッシュして、特別でないものにします。したがって、ドットはドットそのままです。

そして、最初のドットですでにそれを行っているので、それも変更する必要がありますが、それ以外の場合に一致するようにパターンから除外することをお勧めします-貪欲な場合-これはうまく機能しない可能性があります. そして、デフォルトで貪欲であることがよくあります。

/^(?P<domain>[^.]+)\.(?P<locale>[a-zA-Z]{2,})\.(?P<format>\w+)$/
             ##### ^^           ########     ^^
               ^   dot              ^        dot
               |                    |
            not dot      just a little variation

例/デモ:

<?php
/**
 * @link http://stackoverflow.com/a/18546468/367456
 */

$match = '/^(?P<domain>[^.]+)\\.(?P<locale>[a-zA-Z]{2,})\\.(?P<format>\\w+)$/';
$subject = 'forms.it.yml';

var_dump(preg_match($match, $subject)); // int(1)

プログラム出力:

int(1)

所有量指定子を使用すると、さらに最適化できます。

/^(?P<domain>[^.]++)\.(?P<locale>[a-zA-Z]{2,}+)\.(?P<format>\w++)$/
                  ^                          ^                 ^
于 2013-08-31T09:12:31.050 に答える
0

中間のドットではなく、最初のドットをエスケープしたようです。

最初のグループ ( domain) は\.+、1 つ以上のリテラル ドットに貪欲に一致する一致です。

中間パターン.は正規表現のドットなので、すべてに一致します。

否定された文字クラスを使用して、エスケープされたドットを非ドット パターンに変更したい。また、所有量指定子を使用して、一致しないテキストで失敗する速度を上げることをお勧めします。

^(?P<domain>[^.]++)\.(?P<locale>[^.]{2,}+)\.(?P<format>.*+)$
于 2013-08-31T09:17:41.930 に答える