1

次のリンクにスペースやハイフンが含まれている可能性のある7〜12桁の電話番号の解決策を試しました。最初と最後の文字は数字でなければなりません。

7〜12桁に一致する正規表現。スペースまたはハイフンを含めることができます

しかし、私は正規表現をよく理解していません。

$phone_pattern="/^\d(?:[-\s]?\d){6,11}$/";

ここで「:」はどういう意味ですか?

この正規表現では、6〜11文字のハイフンとスペースをどのように除外できますか?

ヘルプヘルプは高く評価されています

4

3 に答える 3

4

これ:は、「非キャプチャグループ」を意味する-の一部です。(?: ... )コンテンツをグループ化しますが、通常のグループ化のように、コンテンツへの後方参照(つまり、$ 1、$ 2など)を作成しません。

その正規表現では、ハイフェンとスペースを含めて6文字から最大11文字まで一致します。つまり、12-------34のようなものが一致します。より厳密なパターンを使用することをお勧めします。

/^\d{7,12}$/

これは数字とのみ一致します。この一致でハイフェンとスペースを許可するが、必要な数だけを取得するには、次のように使用できます。

<?php
$pattern = '/^\d{7,12}$/';
$string = '123-456 789';
$ignoreCharacters = array(' ', '-');

preg_match($pattern, str_replace($ignoreCharacters, $string);
于 2012-10-03T08:19:37.713 に答える
3

それがどのように混乱する可能性があるかは理解できます。は、「キャプチャグループ」であるとは対照的に、(?: ... )実際には「非( ... )キャプチャグループ」を示します。正規表現に対して文字列をテストするだけで、部分文字列をキャプチャしない場合、この2つは目的上実質的に同じです。

、、、、、、も存在することは役に立ちません(?= ... )。これらはすべて異なること(?! ... )を意味します(?<= ... )(?<! ... )(?<foo> ... )

学ぶことはたくさんありますが、確かにやりがいがあります!

于 2012-10-03T08:14:14.037 に答える
2

regexpalのようなテストエンジンを試しましたか(他にも利用できます)、これを頻繁に使用して、式に対してさまざまな文字列をテストし、期待どおりに動作していることを確認します。

私の理解では、この場合、:は単独で動作しているのではなく、 と組み合わせて動作しているということです。

_ この状況では、先行ゼロまたは1回は修飾子の意味ではなく、このグループに新しい意味を与えます。これは、修飾子と組み合わせて、キャプチャをオフにすることで、これを非キャプチャグループ式にすることを意味します。

これが持つ効果は、式の一部を()内に配置すると、デフォルトでキャプチャが発生しますが、?:はこれをオフに切り替えます。

したがって、(?:[-\ s]?\ d)は非キャプチャグループ式になります。

キャプチャされたグループは後方参照で使用され、ほとんどの正規表現エンジンは最大9つの後方参照をサポートすることに注意してください。

したがって、キャプチャを削除すると、マッチングプロセスが高速化され、そのグループを参照しないように選択できるため、実際に参照したいグループの9つの参照の1つを保存できます。

于 2012-10-03T08:56:29.190 に答える