- ベストアンサー
正規表現で数値から始まりYを1字以上含む文字を判別
- PHPで正規表現を使用して、数値から始まりYを1字以上含む文字を判別する方法を教えてください。
- 条件として、数値の最初の文字は「1~9」であるとし、2番目の文字は数値ではないことです。
- また、検証する文字列には、数値、英字、日本語文字列、漢字、記号などが含まれる可能性があります。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
こんな感じです <?php mb_internal_encoding("UTF8"); $a=array("3eiklあいうeE","4yyte","3rrEき134","Eresry","3我Ea","3aaaa","3e","5Eお","3E","3 E"," 3E"); $pattern="/^[33].*[ee]/i"; foreach($a as $val){ print $val; if(preg_match($pattern,$val)){ print "=>〇<br>"; }else{ print "=>×<br>"; } } ?>
その他の回答 (4)
- yambejp
- ベストアンサー率51% (3827/7415)
よく考えたら・・・ ファイルがutf8ではない形式で保存されている可能性が高い。
お礼
その通りでした。ファイルをutf-8で保存してみると解決しました。ありがとうございます。
- shimix
- ベストアンサー率54% (865/1590)
対象文字列がマルチバイト文字であれば、mb_regex_encoding('utf-8') + mb_ereg_match の方がいいのでは? http://jp2.php.net/manual/ja/function.mb-ereg-match.php というか、このくらいの判定なら、正規表現にこだわらないほうが楽じゃないですかねぇ。 function str_check($str, $chk1='3', $chk2='Y') { if (mb_substr($str,0,1) !== $chk1) { return false; } if (mb_strpos($str, $chk2) === false) { return false; } return true; } mb_substrやmb_strposは(指定しなければ)mb_internal_encodingに従います。
お礼
こういうやり方もできるのですね。 でも、大文字に対応させるには追加必要ですね。 こちらも参考にさせて頂きます。 ありがとうございます。
- yambejp
- ベストアンサー率51% (3827/7415)
>mb_internal_encoding("UTF8"); mb_internal_encoding("UTF-8"); でいけるかもしれません。 (OSがよくわからないですがさすがにiconvでUTF-8は組み込まれていますよね?)
お礼
ファイルをutf-8で保存できていなかったのが原因のようです。 解決しました。ありがとうございます。
- yambejp
- ベストアンサー率51% (3827/7415)
ああ、ごめんなさい 修飾子は「ui」ですね $pattern="/^[33].*[ee]/ui";
お礼
すみません。 Warning: preg_match() [function.preg-match]: Compilation failed: invalid UTF-8 string at offset 3 in が物凄く出てきます。php5.2を使っていますがバージョンと関係ありますか? <?php mb_internal_encoding("UTF8"); $a=array("3eiklあいうeE","4yyte","3rrEき134","Eresry","3我Ea","3aaaa","3e","5Eお","3E","3 E"," 3E"); $pattern="/^[33].*[yy]/ui"; foreach($a as $val){ print $val; if(preg_match($pattern,$val)){ print "=>〇<br>"; }else{ print "=>×<br>"; } } ?>
お礼
回答ありがとうございます。 <?php mb_internal_encoding("UTF8"); $a=array("3eiklあいうeE","4yyte","3rrEき134","Eresry","3我Ea","3aaaa","3e","5Eお","3E","3 E"," 3E"); $pattern="/^[33].*[yy]/i"; foreach($a as $val){ print $val; if(preg_match($pattern,$val)){ print "=>〇<br>"; }else{ print "=>×<br>"; } } ?> eeの場合は正しく結果が出ましたが、 yyやkkにしてみるとしっかり動きませんでした。 3eiklあいうeE=>〇 4yyte=>× 3rrEき134=>〇 Eresry=>× 3我Ea=>× 3aaaa=>× 3e=>〇 5Eお=>× 3E=>〇 3 E=>× 3E=>×