2016-02-27 5 views
7

私は少し調べましたが、私が必要としているものと正確に関係するものは何も見つかりませんでした。表現を作成しようとしたときはいつも、正規表現は、指定された形式のみを許可します。 "John-doe"

私は[AZaz09]{3,8}\-[AZaz09]{3,8}の行に沿って何かを試みました。

有効な結果には、テキストまたはテキストのいずれかまたはアルファベットまたは数字を入力できますが、許可される記号は-であり、2つのテキストの間に含まれます。

各テキストは少なくとも3文字({3,8}?)で、その後は-で区切られていなければなりません。

したがって、いくつかの例は、可能性が有効であるために:

Text-Text 
Abc-123 
123-Abc 
A2C-def4gk 

無効なテストは次のようになります。あなたがアンカーを使用し、文字クラス内-ので、文字を使用する必要が

Ab-3 
Abc!-ajr4 
a-bc3-25aj 
a?c-b% 
+1

アクセント付きの文字やその他のアルファベットも一致させますか? "déjà-vus"、 "12μ-13μ"、 "mañana-1234" – trincot

+0

@trincotのように:良い点は、私の答えを 'u'修飾子を反映するように更新しました。 – Jan

答えて

10

個々の文字ではなく、範囲として読み取られます。

試してみてください。

^[A-Za-z0-9]{3,8}-[A-Za-z0-9]{3,8}$ 

デモ:またi修飾子と\dメタ文字とそれ簡素化することができhttps://regex101.com/r/xH3oM8/1

(?i)^[a-z\d]{3,8}-[a-z\d]{3,8}$ 
+0

トップは私の使用には完璧だと思われます:) – mhvvzmak1

+0

私はこのサイトで/ gmが正規表現の最後にあることに気付きましたが、このgmは何をしていますか? – mhvvzmak1

+2

'g'はグローバル修飾語で、' m'は複数行です。それはそこに示すだけです。 'g'はPHPではサポートされていません。 'm'は文字列全体ではなく'^$ 'を各行にマッチさせます。 – chris85

4

次を思い付くことができます:@ chris85が指摘したように

<?php 
$string =" 
Text-Text 
Abc-123 
123-Abc 
A2C-def4gk 
Ab-3 
Abc!-ajr4 
a-bc3-25aj 
a?c-b%"; 

$regex='~ 
     ^\w{3,} # at last three word characters at the beginning of the line 
     -  # a dash 
     \w{3,}$ # three word characters at the end of the line 
     ~xm'; # multiline and freespacing mode (for this explanation) 
       # ~xmu for accented characters 

preg_match_all($regex, $string, $matches); 
print_r($matches); 
?> 

は、\wが同様にアンダースコアにマッチします。 Trincotには良いコメントがありました(アクセント付きの文字にマッチします)。これを達成するには、simply use the u modifier
a demo on regex101.comおよびa complete code on ideone.comを参照してください。

+0

PHPはその中の説明と一緒に動作しません。あなたは質問の本体でそれを行うべきです。 – chris85

+0

@ chris85、おそらく 'x'修飾子をチェックしてください... – trincot

+0

@ chris85:[どうしてですか?](http://ideone.com/oMe3Qp) - これは' x'修飾子のためのものです。 – Jan

3

あなたは

^\w{3,}-\w{3,}$ 

^  // start of the string 
\w{3,} // match "a" to "z", "A" to "Z" and 0 to 9 and requires at least 3 characters 
-  // requires "-" 
\w{3,} // same as above 
$  // end of the string 

Regex Demo

5

アクセント文字を許可する必要がある場合、または中に存在する他の文字、この正規表現を使用することができますUnicode範囲(ギリシャ語やキリル文字などTERS)は、その後、数字のUnicode文字(および\d)と一致するUTF-8をサポート)と\pLのために(u修飾子を使用します。

$string =" 
Mañana-déjà 
Text-Text 
Abc-123 
123-Abc 
A2C-def4gk 
Ab-3 
Abc!-ajr4 
a-bc3-25aj 
a?c-b%"; 

$regex='/^[\pL\d]{3,}-[\pL\d]{3,}$/mu'; 

preg_match_all($regex, $string, $matches); 

var_export($matches); 

出力:

array (
    0 => 
    array (
    0 => 'Mañana-déjà', 
    1 => 'Text-Text', 
    2 => 'Abc-123', 
    3 => '123-Abc', 
    4 => 'A2C-def4gk', 
), 
) 

NB:\wとの違い[\pL\d]はアンダースコアと一致しません。

2

短いもの。

^([^\W_]{3,8})-(?1)$ 
  • [^\W_]short for alnumとして使用することができます。それは\w
  • (?1)からアンダースコアを減算最も明白とパフォーマンスである@ chris85ため

Demo at regex101

私の投票は最初のグループでのパターンにsubroutine callです。

関連する問題