2011-02-08 5 views
1

単一のハイフンとシングルスペースは、単語の中でのみ使用できますが、単語の先頭や末尾にはできません。正規表現を使用したPHP preg_match:単語間のハイフンと空白は1つだけです

if(!preg_match('/^[a-zA-Z0-9\-\s]+$/', $pg_tag)) 
    { 
     $error = true; 
     echo '<error elementid="pg_tag" message="TAGS - only alphanumbers and hyphens are allowed."/>'; 
    } 

私は

---stack---over---flow--- 
stack-over-flow- stack-over-flow2 
    stack over flow 

の下に、これらの入力を受け入れたくないだけこれらは、

stack-over-flow stack-over-flow2 stack-over-flow3 
stack over flow 
stacoverflow 

おかげで許容されています。

+0

入力を正規化する、つまりすべての連続する空白とダッシュを1つに減らし、最初と最後から削除する方が簡単でしょう。 –

+0

@Felix Kling:このアイデアをありがとう!どのように入力を正規化するのですか? – laukok

+0

私の答えを見てください。 –

答えて

5
$aWords = array(
    'a', 
    '---stack---over---flow---', 
    ' stack over flow', 
    'stack-over-flow', 
    'stack over flow', 
    'stacoverflow' 
); 

foreach($aWords as $sWord) { 
    if (preg_match('/^(\w+([\s-]\w+)?)+$/', $sWord)) { 
     echo 'pass: ' . $sWord . "\n"; 
    } else { 
     echo 'fail: ' . $sWord . "\n"; 
    } 
} 

と出力:コメントに関して

^    # Match from the very beginning of the string 
(   # Start Group 
    \w+  # At least one "word" character 
    (  # Start Subgroup 
     [\s-] # A single space or a dash 
     \w+ # At least one "word" character 
    )?  # End Subgroup is optional 
)+   # End group - allow it multiple times 
$    # Match until the very end of the string 
+0

文字列 'a'は失敗します。 –

+0

真実ですが、作戦は決して通過しなければならないとは言いませんでした。 – enobrev

+0

'aa'は成功しますが、' a'は失敗します。私はあなたの論理を見ません。 –

1

pass: a 
fail: ---stack---over---flow--- 
fail: stack over flow 
pass: stack-over-flow 
pass: stack over flow 
pass: stacoverflow 

正規表現の内訳もう一つのアイデアは、入力を "正常化" することで、すなわち、すべての軽減連続するスペースとダッシュを1つにして、先頭から末尾まで削除します。

$pg_tag = preg_replace(array('/\s+/', '/-+/'), 
         array(' ', '-'), 
         trim($pg_tag, ' -')); 

参考:preg_replacetrim

+0

Felix Klingに感謝します! – laukok

1

それらの間にスペースで文字や数字を受け入れるように。唯一のスペースの場合は、テストに合格しないか、または受諾しません。

この正規表現は「自宅作業」のような文字列を受け入れますが、「」で失敗しました。

var pattern = /^(?=.*\S)[.+a-z0-9A-Z-.#:!*$^_|?` ]+$/; 
    return pattern.test(value); 

文字列を受け入れるとtrueを返します。

関連する問題