正規表現でドット、ハイフン、アンダーバーをチェックしたいです
ゲスト
ゲスト
ATOMRSS
  • コード求むID: 290
  • 登録日時:  2008/06/27 11:30
  • 最終更新日時: 2008/09/20 22:46
  • アクセス数: 1408
  • タグ:  php 正規表現
  • codeなにがしブックマークに追加する 0 users
  • このページを del.icio.us に追加
  • このページをはてなブックマークに追加

PHPで、正規表現を使って入力された文字列をチェックしたいです。

下記を参考にし、色々と試したのですが、
うまく動かないのでヒントをいただけると助かります。
参考: http://code.nanigac.com/forum/view/249


条件は、
2文字以上20文字以下
英小文字
英大文字
数字
ハイフン
アンダーバー
ピリオド

ハイフンとアンダーバーとピリオドは先頭文字不可
ピリオドの末尾不可
ピリオドの連続は不可


ホームページやらPHP本を調べたのですがわかりません。
PHP初心者なのでご教授いただけると幸いです。
よろしくお願いいたします。

コメント

  • ゲスト
  • 1:ゲスト (質問者です)
  • 2008/06/27 15:22

質問者です。
以下のように書いてみました。

preg_match("/^(?!.*..)[a-zA-Z0-9]([_-.a-zA-Z0-9]{1,18})[_-a-zA-Z0-9]$/",  $hogehoge)

が、やはり動作しません。

どこか根本的に誤っているのでしょうか?

  • GoodJob
  • 0



ピリオドは(.)はメタ文字なのでエスケープして(\.)にしないとだめだとおもいます。

/^(?!.*\.\.)[a-zA-Z0-9]([_-\.a-zA-Z0-9]{1,18})[_-a-zA-Z0-9]$/


  • GoodJob
  • 0

  • ゲスト
  • 5:ゲスト
  • 2008/06/28 23:38

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

  • GoodJob
  • 0

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]と書いておられてますが、
自分は記号を後ろにうけるのが好みだったので上記のように書きました。
とくにここに動作の違いはないはずです。

  • GoodJob
  • 0

  • ゲスト
  • 7:ゲスト ((質問者です))
  • 2008/07/01 09:43

お返事が遅くなりスミマセン。

4:kumazoさん、5:ゲストさん、6:夜行さん、ありがとうございました。

ピリオドにエスケープが必要なのを初めて知りました!
大変勉強になりました。

色々試したのですが、1行にまとめてもうまく動作せず、
(間違いなく私の知識不足ですが・・・)
5:ゲストさんが言うように、strposを用い、
大掛かりになりましたが、動作させることができました。

$err=1;
$errStr="";
if(strlen($str)>1 and strlen($str)<21){
 if(ereg("^[0-9A-Za-z_\.-]+$", $str)){
  if(!ereg("^[_\.-]+$", substr($str, 0, 1))){
   if(!ereg("^[\.]+$", substr($str, strlen($str)-1, 1))){
    if(strpos($str, "..")==0){
     $err=0;
    }else{
     $errStr="連続ピリオド";
       }
   }else{
    $errStr="末尾にピリオド";
      }
  }else{
   $errStr="先頭にハイフン、アンダーライン、ピリオド";
     }
 }else{
  $errStr="半角英小文字、数字、ハイフン、アンダーライン、ピリオド以外";
    }
}else{
 $errStr="2文字以上20文字以内にしなさい";
   }
if($err==1){
$errStr
}else{
$hogehoge
}
}

色々ありがとうございました。
PHPをもっと勉強しないと^^;

  • GoodJob
  • 0

  • ゲスト
  • 8:ゲスト
  • 2008/07/01 15:48

深いネストは美しくないし読みにくいですよ。
判断部分をそもそもメソッドにしてエラーがあったらfalseを返すような実装の方がいいと思います。

  • GoodJob
  • 0

  • ゲスト
  • 9:ゲスト (ぱ)
  • 2008/07/01 18:55

素直~に条件毎に正規表現を分割しました。
「言明を使わずに、三行くらいに分けて書いちゃだめなんですか?」というのはこういうことかと。

1発で判定できる正規表現を使ってもいいんでしょうが、後で見た時に理解出来ない可能性もあるので、こういう方法もアリだと思いますよ。
(正規表現の理解が足りないことの言い訳^^;)

パフォーマンス(速度)が求められるなら再検討の余地はありますが。

function check($val){
    // 英数字、ハイフン、アンダーバー、ピリオドで2文字以上20文字以下
    $p "/^[0-9a-z_\.-]{2,20}$/i";
    if(!preg_match($p, $val))    return false;
    // ハイフンとアンダーバーとピリオドは先頭文字不可
    $p "/^[_\.-]/";
    if(preg_match($p, $val))    return false;
    // ピリオドの末尾不可
    $p "/\.$/";
    if(preg_match($p, $val))    return false;
    // ピリオドの連続は不可
    $p "/\.\./";
    if(preg_match($p, $val))    return false;
    // 全ての条件をクリア
    return true;
}

  • GoodJob
  • 0

  • ゲスト
  • 10:ゲスト
  • 2008/09/20 22:46

亀レスですが。

長さのチェックをstrlenなどで行ってよければ、他は以下の正規表現で充足すると思います。

/^[^\W_][\w-]*(.[\w-]+)*$/


  • GoodJob
  • 0

前へ 1 次へ

コメントする

[block]から[/block]までの範囲はブロック表示されます。
部分的に目立たせたい時や、引用などにお使いください。

[code]から[/code]までの範囲は等幅表示されます。
ソースコードや設定ファイルの記述などにお使いください。

ゲスト投稿者:ゲスト:

関連ソースコード・ノウハウを登録

PDFLib | A library for processing PDF on the fly プレゼン公開・共有サイト handsOut.jp オープンタイプ株式会社 チーム・マイナス6% - みんなで止めよう温暖化

ブックマークコメント