2012-03-11 16 views
5

preg_matchの使い方を学びたいと思います。私はユーザにa-zA-Z0-9を含むことができる2〜20文字のユーザ名でサインアップすることを許可したい。2〜20文字の英数字を一致させる正規表現。文字列内の任意の場所にハイフンを1つ使用できます。

今イムが迷子にトリッキーな部分は、私は彼らがそうユーザ名の任意の場所に1つのハイフンを含めることができるようにしたい、

 
-Brad = TRUE 

--Brad = FALSE 

B-Rad = TRUE 

答えて

5

で二するpreg_matchを使用しています。今、あなたはどこかで単一-文字(トリック部分を)許可したい

^[a-zA-Z0-9]{2,20}$ 

:あなたは2-20特定の文字で構成されたユーザー名を欲しい

それならば-文字のみが許可されています文字列の末尾に別の-によって追跡されていません。

[-](?=[^-]*$) 

これは、いわゆる先読みアサーションです。交代と組み合わせることで、正規表現はに完了します、この1つはあなたの長さの仕様を尊重与えられた他の回答に比べ

^(?:[a-zA-Z0-9]|[-](?=[^-]*$)){2,20}$ 

。ここで

+0

WOW! - この回答をありがとう。あなたもそれをうまく説明しました。私はちょうど2つのpreg_match文を使って試して解決しようとしていました。 –

+0

@BradleyRoberts:どうぞよろしくお願いいたします。あなたはあなたが書いたことを書いています*あなたの質問のパターンはそれほど明白ではなかったので、ちょっとしたことがありました;)あなたの正規表現の進歩に幸運を祈るなら、その言語で考えるのには時間がかかりますが、また、ここでポップアップする正規表現の質問に答えることで改善しようとすることもできます。なぜなら、他の答えはしばしば学ぶべきものがあるからです。 – hakre

3

あなたはとするpreg_match使用できます

\w*-?\w* 

それは、 1つのハイフンが存在することを確認しますが、ハイフンにも一致します。

(\w*-?\w+)|(\w+-?\w*) 

ハイフンのみを一致させないようにすることもできます。または、一致の長さが1より大きいかどうかを確認できます。

あなたはできると言いましたので、ハイフンは必須ではないと思います。そうなら、?正規表現で。

文でのマッチングを計画している場合は、\ w +部分に単語区切り(\ b)を使用できます。トリミングされた文字列でこれを使用している場合は、--Bra-dと一致することを避けるために、それぞれ開始と終了に^と$を追加します。

+0

私は、ユーザーが一つだけハイフンを許可することにしたいです。彼らはハイフンを持っている必要はありません。私はそれらを2〜20の長さに制限したいのですが、含まれる他の文字はa-zA-Z0-9になります。 –

+0

それでは、これらのパターンは複数のハイフンを拒否するのが最も良い –

+0

ですか? – dldnh

2
^[a-zA-Z0-9]*\-?[a-zA-Z0-9]*$ 

編集正規表現です:長さのためのクイックソリューション:あなたはこのステップバイステップを構築することができます^.{2,20}$

+0

これはうまくいっていますが、どうすれば2〜20文字に制限できますか? –

+0

編集していただきありがとうございます。私は遊びをして、PHPの機能を作って、場所を入力し続けてください: –

+2

@Bradley Robertsいつでも。私は長さの検証のために 'strlen'を使う方が良いと思います。 – dotoree

2

は、私はそれを行うだろう方法は次のとおりです。

if (preg_match(
    '/# Match pwd of alpha-numbers allowing one optional dash. 
    ^    # Anchor to start of string. 
    (?=.{2,20}\z)  # Assert length is from 2 to 20 chars. 
    [a-zA-Z0-9]*  # Zero or more alpha-num before dash. 
    (-[a-zA-Z0-9]*)? # Optional dash and more alpha-num. 
    \z    # Anchor to end of string. 
    /x', $text)) { 
    # Successful match 
} else { 
    # Match attempt failed 
} 
関連する問題