修正
あなたのリピート条件が含まれるべきです "*"。あなたの正規表現は、あなたが達成したいもののために正しいかどうかはチェックしませんでしたが、この補正は、次の文字列のために働く:
$testStrings=["aaa123","a1b2c3","a1b23d"];
foreach($testStrings as $s)
var_dump(preg_match('/^(?![_\-\s0-9])(?!.*?[_\-\s]$)(?=.*[a-zA-Z]){3,}[_\-\sa-zA-Z0-9]+$/', $s));
他の実装
言語はJavaScriptのように思わとして、ここでは最適化されていますあなたが達成したい何のための実装:
"a24be4Z".match(/[a-zA-Z]/g).length>=3
我々はすべてのマッチのリストを取得し、少なくとも3 は、結果を作成する必要があるとして、「最速」の方法ではないことがあるかどうかを確認します。 )
/(?:.*?[a-zA-Z]){3}/.test("a24be4Z")
がより高速です。 "。*?"他の組み合わせをテストする前に、 "test"メソッドが文字列の末尾までのすべての文字と一致することを避けます。
期待どおり、最初の提案(一致の数を数える)は最も遅いです。 チェックhttps://jsperf.com/check-if-there-are-3-ascii-characters。
https://regex101.com/ – jdv