2016-05-02 49 views
1

まあ、私は固まっていますが、RegExがPHP preg_matchに提供する正しいフォームが見つかりません。許可されている文字または文字列の存在を確認してください

私は2つの弦を持っています。 "mdo""o"と言ってくださいが、実際はランダムかもしれません。

私は許可された文字と文字列の辞書を持っています。

たとえば、許可される文字は"a-gm0-9"であり、許可される文字列は"do""si"です。

GOAL

私は、入力文字列は、任意の文字または文字列が、辞書、大文字と小文字を区別しないで、それらが含まれていないことを確認しようとしています。

mが文字列doのように許可されているので、"mdo"のケースは一致しません。代わりにoと同じではありません。oは許可された文字ではなく、許可された文字列全体が含まれていませんdo

私の苦労理由

それは[^a-gm0-9](?!do|si)を否定しても大丈夫ですが、私は達成できないことは、次のPHPコードを適用するために、単一の正規表現の内側にそれらを配置することです:

<?php 
    $inputStr = 'mdo'; 
    $rex = '/?????/i';  // the question subject 
    // if disallowed chars/strings are found... 
    if(preg_match($regex, $inputStr) == 1) 
    return false;  // the $inputStr is not valid 
    return true; 
?> 

2つのカスケードpreg_matchesがロジックを破壊し、動作しないためです。

1つの正規表現で文字チェックとグループチェックを混在させるにはどうすればいいですか?彼らの位置は関係ありません。

+0

許可された文字と部分文字列をチェックし、if条件でpreg_match関数自体を否定する方が簡単です。 –

+0

主な問題(私が思う)は、 "do"と "si"の両方が許可されていない文字をカウントするということです。 – Random

答えて

1

あなたはこのパターンを使用することができます

return (bool) preg_match('~^(?:do|si|[a-gm0-9])*+\C~i', $inputStr); 

をアイデアはpossessive quantifierを繰り返し、グループ内のスタートからすべての許可文字とサブストリングに一致するように、シングルバイト\Cが残っているかどうかを確認することです。量指定子は欲張りで所有権があるので、見つかった場合は1バイト後には許可されません。ほとんどの時間は、preg_match機能、たとえば否定するよりシンプルであること

注:(あなたは空の文字列を許可したくない場合は、または+数量詞付き)

return (bool) !preg_match('~^(?:do|si|[a-gm0-9])*$~iD', $inputStr); 

+1

このように正規表現を処理できる人は無限大です。それは両方のバージョンでうまく動作します。ありがとうございました! – TechNyquist

関連する問題