夏が終わったと感じる瞬間って、どんな時?

数値から始まり、Yを1字以上含むものをPHPで判別させたいです。
・最初の数値は「1~9」を扱いたいです。
・2番目に数値がくることはありません。
・使う文字は、数値・英字・日本語文字列・漢字・記号などあらゆる文字です。
・使う文字は全て全角半角の両方に対応
・全体的な数値と文字列の割合はバラバラです。
・空白から始まっても×
・文字数制限は特にありません。

たとえば「3」から始まり「e」を含むとき

3eiklあいうeE(←○)
4yyte(←3から始まっていない×)
3rrEき134(←○)
Eresry(←3から始まっていない×)
3我Ea(←○)
3aaaa(←eがない×)
3e(←○)
5Eお(←3から始まっていない×)
3E(←○)
3 E(←○)
 3E(←空白から始まっている×)


$str = $_GET["s"]; //3我Ea
if($str{0}=="1" || $str{0}=="1"){$pattern = '/^(1|1)*.(Y|y)/';}
・・・
if($str{0}=="9" || $str{0}=="9"){$pattern = '/^(9|9)*.(Y|y)/';}
if (preg_match($pattern, $str)) {
echo htmlspecialchars($str, ENT_QUOTES, 'UTF-8')."は○";
} else {
echo htmlspecialchars($str, ENT_QUOTES, 'UTF-8')."は×";
}

うまくいきません。どのようにしたら良いでしょうか。

A 回答 (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 "=&gt;〇<br>";
}else{
print "=&gt;×<br>";
}
}
?>
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
<?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 "=&gt;〇<br>";
}else{
print "=&gt;×<br>";
}
}
?>

eeの場合は正しく結果が出ましたが、
yyやkkにしてみるとしっかり動きませんでした。

3eiklあいうeE=>〇
4yyte=>×
3rrEき134=>〇
Eresry=>×
3我Ea=>×
3aaaa=>×
3e=>〇
5Eお=>×
3E=>〇
3 E=>×
 3E=>×

お礼日時:2012/07/22 10:40

よく考えたら・・・


ファイルがutf8ではない形式で保存されている可能性が高い。
    • good
    • 0
この回答へのお礼

その通りでした。ファイルをutf-8で保存してみると解決しました。ありがとうございます。

お礼日時:2012/07/24 18:59

対象文字列がマルチバイト文字であれば、mb_regex_encoding('utf-8') + mb_ereg_match の方がいいのでは?



http://jp2.php.net/manual/ja/function.mb-ereg-ma …


というか、このくらいの判定なら、正規表現にこだわらないほうが楽じゃないですかねぇ。

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に従います。
    • good
    • 0
この回答へのお礼

こういうやり方もできるのですね。
でも、大文字に対応させるには追加必要ですね。
こちらも参考にさせて頂きます。
ありがとうございます。

お礼日時:2012/07/24 19:01

>mb_internal_encoding("UTF8");



mb_internal_encoding("UTF-8");

でいけるかもしれません。
(OSがよくわからないですがさすがにiconvでUTF-8は組み込まれていますよね?)
    • good
    • 0
この回答へのお礼

ファイルをutf-8で保存できていなかったのが原因のようです。
解決しました。ありがとうございます。

お礼日時:2012/07/24 18:58

ああ、ごめんなさい


修飾子は「ui」ですね

$pattern="/^[33].*[ee]/ui";
    • good
    • 0
この回答へのお礼

すみません。
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 "=&gt;〇<br>";
}else{
print "=&gt;×<br>";
}
}
?>

お礼日時:2012/07/22 15:12

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!