PHPで、正規表現を使って入力された文字列をチェックしたいです。
下記を参考にし、色々と試したのですが、
うまく動かないのでヒントをいただけると助かります。
参考:
条件は、
2文字以上20文字以下
英小文字
英大文字
数字
ハイフン
アンダーバー
ピリオド
ハイフンとアンダーバーとピリオドは先頭文字不可
ピリオドの末尾不可
ピリオドの連続は不可
ホームページやらPHP本を調べたのですがわかりません。
PHP初心者なのでご教授いただけると幸いです。
よろしくお願いいたします。
コメント

- 4:kumazo
- 2008/06/27 22:15
ピリオドは(.)はメタ文字なのでエスケープして(\.)にしないとだめだとおもいます。
/^(?!.*\.\.)[a-zA-Z0-9]([_-\.a-zA-Z0-9]{1,18})[_-a-zA-Z0-9]$/

- 5:ゲスト
- 2008/06/28 23:38
言明を使わずに、三行くらいに分けて書いちゃだめなんですか?
PHPを使っているなら、strposとかも併用したほうが、パフォーマンスは高いと思います。
(答えになってなくてすいません)

- 6:夜行
- 2008/06/29 13:19
4:kumazoさんの書いておられるように、ビリオドは「任意の1文字」を示すので
文字のピリオドについてはエスケープの必要があります。
今回の内容を把握して1:ゲストさんの正規表現を見てみますと、
「3文字以上20文字以下」になっているような気がします。
「最初の文字のパターン+間に1~18文字+最後の文字」ですから3文字ですよね。
それをふまえて修正してみました。
/^(?!.*\.\.)[a-zA-Z0-9]([a-zA-Z0-9-_.]{0,18})[a-zA-Z0-9-_]$/
4:kumazoさんは[_-\.a-zA-Z0-9]と書いておられてますが、
自分は記号を後ろにうけるのが好みだったので上記のように書きました。
とくにここに動作の違いはないはずです。

- 7:ゲスト ((質問者です))
- 2008/07/01 09:43
お返事が遅くなりスミマセン。
4:kumazoさん、5:ゲストさん、6:夜行さん、ありがとうございました。
ピリオドにエスケープが必要なのを初めて知りました!
大変勉強になりました。
色々試したのですが、1行にまとめてもうまく動作せず、
(間違いなく私の知識不足ですが・・・)
5:ゲストさんが言うように、strposを用い、
大掛かりになりましたが、動作させることができました。
$err=1;
$errStr="";
if(strlen($str)>1
if(ereg("^[0-9A-Za-z_\.-]+$",
if(!ereg("^[_\.-]+$",
if(!ereg("^[\.]+$",
if(strpos($str,
$err=0;
}else{
$errStr="連続ピリオド";
}
}else{
$errStr="末尾にピリオド";
}
}else{
$errStr="先頭にハイフン、アンダーライン、ピリオド";
}
}else{
$errStr="半角英小文字、数字、ハイフン、アンダーライン、ピリオド以外";
}
}else{
$errStr="2文字以上20文字以内にしなさい";
}
if($err==1){
$errStr
}else{
$hogehoge
}
}
色々ありがとうございました。
PHPをもっと勉強しないと^^;

- 9:ゲスト (ぱ)
- 2008/07/01 18:55
素直~に条件毎に正規表現を分割しました。
「言明を使わずに、三行くらいに分けて書いちゃだめなんですか?」というのはこういうことかと。
1発で判定できる正規表現を使ってもいいんでしょうが、後で見た時に理解出来ない可能性もあるので、こういう方法もアリだと思いますよ。
(正規表現の理解が足りないことの言い訳^^;)
パフォーマンス(速度)が求められるなら再検討の余地はありますが。
function
}

- 10:ゲスト
- 2008/09/20 22:46
亀レスですが。
長さのチェックをstrlenなどで行ってよければ、他は以下の正規表現で充足すると思います。
/^[^\W_][\w-]*(.[\w-]+)*$/
前へ 1 次へ![]()
コメントする
[block]から[/block]までの範囲はブロック表示されます。
部分的に目立たせたい時や、引用などにお使いください。
[code]から[/code]までの範囲は等幅表示されます。
ソースコードや設定ファイルの記述などにお使いください。






質問者です。
$hogehoge)
以下のように書いてみました。
preg_match("/^(?!.*..)[a-zA-Z0-9]([_-.a-zA-Z0-9]{1,18})[_-a-zA-Z0-9]$/",
が、やはり動作しません。
どこか根本的に誤っているのでしょうか?