- ベストアンサー
ASCII文字列以外を検出する正規表現
ASCII文字列(半角英数・記号)以外を検出する正規表現を教えてください。 WEBで検索したのですが探し方が悪いのか見つかりませんでした。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
No.2です。制御コードも含める、というのであれば、16進数のコードで範囲指定すればいいのではないでしょうか。 if (ereg("^[\x01-\x7f]*$", $str)) { ※\x00からにすると、null文字と見なされてPHPがWarningを出してしまったので\x01からになっています。
その他の回答 (3)
- notnot
- ベストアンサー率47% (4900/10361)
#1です。 質問内容と補足に書かれたコードがあってません。 $str の中に「半角英数記号」以外の文字が1文字でもあるかどうかを調べたいという質問じゃなかったのですか? if (ereg("[^!-~]", $str)) { echo "半角英数記号以外がある"; } else { echo "すべて半角英数記号である"; } 空白は記号じゃないという判断で[^!-~]にしましたが、もし空白も記号に入れるなら[^ -~]です。改行コードはまさか記号に含めないですよね?
補足
質問は「ASCII文字列以外を検出する正規表現を教えてください」です。空白や改行、タブやエスケープなどもASCII文字列だと思います。
- ham_kamo
- ベストアンサー率55% (659/1197)
$strに空白や\n\r(改行)も入ってますが、これらも含めるのですか? 空白を含めて改行は含めないのなら、 if (ereg("^[ -~]*$", $str)) { とすればいいと思いますが、改行も含める(複数行のパターンマッチを行う)のであれば、 if (preg_match("/^[ -~]*$/m", $str)) { とすればいかがでしょうか。
お礼
if (preg_match("/^[ -~]*$/m", $str)) { として試してみましたが、$str = "aAzZ\n\r &*()#あ@"; のように日本語を含めた場合も true が返ってしまいました。
- notnot
- ベストアンサー率47% (4900/10361)
[^!-~] 半角記号の最小値!と最大値~の範囲の否定で表します。英数字もこの範囲に含まれます。
補足
[^!-~]を試して見ましたがうまく行きませんでした。 PHPで以下のようにやっているのですがこれをどのように変えたらいいでしょうか? $str = "aAzZ\n\r &*()#@"; if (ereg("^[a-zA-Z0-9]*$", $str)) { // このままだと英数字のみ検証 echo "すべてASCII文字である"; } else { echo "すべてASCII文字ではない"; }
お礼
ereg("^[\x01-\x7f]*$", $str) なるほど、こういうやり方があるんですね。これで思ったとおりに動作しました。改行コードやタブ、エスケープなども問題ないようです。 ありがとうございました。