• ベストアンサー

ASCII文字列以外を検出する正規表現

ASCII文字列(半角英数・記号)以外を検出する正規表現を教えてください。 WEBで検索したのですが探し方が悪いのか見つかりませんでした。

質問者が選んだベストアンサー

  • ベストアンサー
  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.4

No.2です。制御コードも含める、というのであれば、16進数のコードで範囲指定すればいいのではないでしょうか。 if (ereg("^[\x01-\x7f]*$", $str)) { ※\x00からにすると、null文字と見なされてPHPがWarningを出してしまったので\x01からになっています。

stoutontap
質問者

お礼

ereg("^[\x01-\x7f]*$", $str) なるほど、こういうやり方があるんですね。これで思ったとおりに動作しました。改行コードやタブ、エスケープなども問題ないようです。 ありがとうございました。

その他の回答 (3)

  • notnot
  • ベストアンサー率47% (4900/10361)
回答No.3

#1です。 質問内容と補足に書かれたコードがあってません。 $str の中に「半角英数記号」以外の文字が1文字でもあるかどうかを調べたいという質問じゃなかったのですか? if (ereg("[^!-~]", $str)) { echo "半角英数記号以外がある"; } else { echo "すべて半角英数記号である"; } 空白は記号じゃないという判断で[^!-~]にしましたが、もし空白も記号に入れるなら[^ -~]です。改行コードはまさか記号に含めないですよね?

stoutontap
質問者

補足

質問は「ASCII文字列以外を検出する正規表現を教えてください」です。空白や改行、タブやエスケープなどもASCII文字列だと思います。

  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.2

$strに空白や\n\r(改行)も入ってますが、これらも含めるのですか? 空白を含めて改行は含めないのなら、 if (ereg("^[ -~]*$", $str)) { とすればいいと思いますが、改行も含める(複数行のパターンマッチを行う)のであれば、 if (preg_match("/^[ -~]*$/m", $str)) { とすればいかがでしょうか。

stoutontap
質問者

お礼

if (preg_match("/^[ -~]*$/m", $str)) { として試してみましたが、$str = "aAzZ\n\r &*()#あ@"; のように日本語を含めた場合も true が返ってしまいました。

  • notnot
  • ベストアンサー率47% (4900/10361)
回答No.1

[^!-~] 半角記号の最小値!と最大値~の範囲の否定で表します。英数字もこの範囲に含まれます。

stoutontap
質問者

補足

[^!-~]を試して見ましたがうまく行きませんでした。 PHPで以下のようにやっているのですがこれをどのように変えたらいいでしょうか? $str = "aAzZ\n\r &*()#@"; if (ereg("^[a-zA-Z0-9]*$", $str)) { // このままだと英数字のみ検証 echo "すべてASCII文字である"; } else { echo "すべてASCII文字ではない"; }

関連するQ&A