重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

電話番号の正規表現について質問です。

$value = '000-111-2222';

これだけだと通りますが
function tel( $value ) {
return !preg_match( '/^\d{2,3}\-\d{3,4}\-\d{4}$/', $value );
}

市外局番がなくても通るようにしたくこのようにしましたがはじかれます^^;
function tel( $value ) {
return !preg_match( '/^\d{2,3}\-\d{3,4}\-\d{4}$ | ^\d{2,4}\-\d{3,4}$/', $value );
}

いずれのケースにも当てはまらないのではじくようにしたいのですが、実現するにはどう書けばいいのでしょうか?

A 回答 (6件)

考え方としては、市外局番の場合は0から、そうでない場合は数字から始まり


数字でおわるとか、ハイフンが続かないとか、ハイフンで2つないし3つにわかれるとか、
チェックのやりかたはあるけど、しょせん実在するかどうかをチェックできないので無意味
数字とハイフン以外使っていない程度のチェックで十分

<?PHP
check("03-1234-5678");
check("0312345678");
check("03---4-8");
check("-");
check("-123-");
check("0a123");
function check($num){
$pattern="/^[0-9\-]+$/";
print $num.":";
if(preg_match($pattern,$num)){
print "ok<br>\n";
}else{
print "ng<br>\n";
}
}
?>
    • good
    • 0
この回答へのお礼

確かに実在するかはチェックしないので簡単に考えたほうが良かったですね。
他の方からのご指摘の通り無駄なスペースも入れていたのでとても勉強になりました!

ありがとうございます^^

お礼日時:2013/07/26 17:14

>> あと, この例では問題ないんだけど「市外局番」が 4桁や 5桁の地域はこの世には存在しないんでしょうか?



ほかの回答見るまで気づかなかった。
実家は4桁ですが・・・まさか5桁まであるとは・・・
http://www.sentworks-job.jp/oyakudati/tel/mie.html
    • good
    • 0
この回答へのお礼

お返事が遅くなりました^^;
5桁の市外局番あるんですね・・・

これは注意が必要ですね!

お礼日時:2013/07/26 17:12

蛇足ですが、




「^」
先頭にマッチ。m修飾子をつけたときは行頭にマッチ。

「\A」
先頭にマッチ。

「$」
末尾にマッチ。末尾の改行コードを許可する。m修飾子をつけたときは行末にマッチ。

「\Z」
末尾にマッチ。末尾の改行コードを許可する。

「\z」
末尾にマッチ。末尾の改行コードを許可しない。


こういう違いみなさんご存じですか・・・?
原則的に「\A」と「\z」を用いるべきだとは思います。

あとハイフンのエスケープは不要。
バックスラッシュに関しては個人的に全てエスケープするポリシーを取っているので、見にくければ「\\」は「\」にしてください。

引用符
http://php.net/manual/ja/language.types.string.php


function is_valid_phone_number($value) {
return preg_match('/\\A(?:\\d{2,3}-\\d{3,4}-\\d{4}|^\\d{2,4}-\\d{3,4})\\z/', $value);
}
    • good
    • 0

| の前後に空白が入ってますので、取り除いてください。



^ が文字列先頭を意味するのは正規表現の先頭の時だけです。
$ が文字列末尾を意味するのは正規表現の末尾の時だけです。
    • good
    • 0

「いずれのケースにも当てはまらないのではじくようにしたい」のなら, 「はじかれます」は期待する動作そのものだから何も問題になっていないのでは?



あと, この例では問題ないんだけど「市外局番」が 4桁や 5桁の地域はこの世には存在しないんでしょうか?
    • good
    • 0

$ | ^


|の前後に空白があるようですが、これはわざとでしょうか?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!