質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

2回答

5092閲覧

PHP 正規表現について

pac894398

総合スコア429

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

2クリップ

投稿2014/12/27 10:12

PHP文字列の中に
・全角ひらがな
・全角カタカナ
・全角漢字
・半角英数字(A~Z、0~9)
・半角のハイフン「-」
・半角のドット「.」
以外の文字列がないか確認したいです。

http://www.tryphp.net/2012/03/03/phpsample-preg-str-2/
上記サイトを見つけたのですが、組み合わせ方が分かりませんでした。
ご回答よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

・全角漢字

目的によりますが一言で漢字と言ってもいろいろです。正規表現だと意図しない文字も範囲に含まれているかもしれません。

lang

1<?php 2$str = "丆"; 3 4function is_valid_japanese($str) 5{ 6 return (bool)preg_match('/\A[.ぁ-ゞァ-ヾ一-龥朗-鶴a-z0-9-]*+\z/ui', $str); 7} 8 9var_dump(is_valid_japanese($str)); // bool(true) 10 11mb_substitute_character("none"); 12$str = mb_convert_encoding($str, "SJIS-win", "UTF-8"); 13 14var_dump(strlen($str)); // int(0) .... 漢字だが CP932 に変換できない

Unicode 限定であれば特に問題無いです。が、第一・第二水準以外は含めたくない、とかであれば、次のように適当なエンコーディングに変換できるかで確認すると良いかもしれません(その場合、正規表現の部分はもっとマイルドでも良いです)。

lang

1<?php 2$str = "丆"; 3 4function is_valid_japanese($str) 5{ 6 $tmp = mb_convert_encoding($str, 'ISO-2022-JP', 'UTF-8'); 7 $tmp = mb_convert_encoding($tmp, 'UTF-8', 'ISO-2022-JP'); 8 9 if ($tmp !== $str) { 10 return false; 11 } 12 13 return (bool)preg_match('/\A[.ぁ-ゞァ-ヾ一-龥朗-鶴a-z0-9-]*+\z/ui', $str); 14} 15 16var_dump(is_valid_japanese($str)); // bool(false) 17 18mb_substitute_character("none"); 19$str = mb_convert_encoding($str, "SJIS-win", "UTF-8"); 20var_dump(strlen($str)); // int(0)

投稿2014/12/28 00:40

ngyuki

総合スコア4514

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

TRY PHP!で紹介されている正規表現はかなり煩雑で、個人的には採用したくないものです。以下の問題点を抱えています。

  1. 文字コードの範囲指定に漏れがあります。定義されるべき範囲はプログラマの意図によって異なりますが、少なくとも私の判断では全てをカバーしきれていないことになります。

  2. u修飾子は不正なUTF-8シーケンスが含まれているときにpreg_match関数にFALSEを返させる特性を持っていますが、このコードは一切このことを考慮していません。不正なUTF-8シーケンスを混ぜ込んだ文字列を判定したときに意図しない動作になります。以下のコードを実行すると [漢字]は、すべて ひらがな と カタカナ です。 と出力されるでしょう。

lang

1$checkStr = "漢字\xff\xff\xff"; 2if (preg_match('/[^ぁ-んーァ-ヴー]/u', $checkStr)){ 3 echo '['.$checkStr.'] の中に ひらがな と カタカナ でない文字が含まれています。<br>'; 4} else { 5 echo '['.$checkStr.'] は、すべて ひらがな と カタカナ です。<br>'; 6}

範囲指定に関してはPentan.infoで紹介されているものをおすすめしておきます。**「想定していないものを探す」のではなく、「最初から最後まで想定しているものだけで構成されているか調べる」**という書き方になっていることに注目してください。こう書けば先ほどのu修飾子に関する問題も解消出来ます。

lang

1function is_valid_japanese($str) { 2 return (bool)preg_match('/\A[.ぁ-ゞァ-ヾ一-龥朗-鶴a-z0-9-]*+\z/ui', $str); 3}

以下補足

  1. この関数は空文字列を許可しています。空文字列を許可しない場合は、*+++に変更してください。

  2. ^``$の代わりに\A``\z*``+の代わりに*+``++を採用している理由に関してはこちらを参照してください。

投稿2014/12/27 10:35

mpyw

総合スコア5223

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問