- ベストアンサー
目的の文字列を取得するには?
×××× 2011年10月6日 ×××××× というような文字列から日付の部分を取り出そうとしています。 if (mb_ereg("([0-9]{4})年([0-9]{2,})月([0-9]{2,})日",$string,$result)){ echo $result; } という方法で取得しようとしているのですが、失敗します。 半角数字と全角の漢字が混在しているような文字列から、目的の部分を取得する にはどうすればいいでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
$string = '×××× 2011年10月6日 ××××××'; // mb_regex_encoding('UTF-8'); /* 文字コードを明示的に指定して置く方が確実 */ if ( mb_ereg( "([0-9]{4})年([0-9]{1,2})月([0-9]{1,2})日", $string, $result ) ){ echo $result; } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 厳密にマッチした文字列が日付なのか判定する場合。 $string = '×××× 2011年10月6日 ××××××'; if ( preg_match_all("/([0-9]{4})年([0-9]{1,2})月([0-9]{1,2})日/", $my_str, $matches, PREG_SET_ORDER) ) { $my_date = (string) $matches[0][0]; //正規表現にマッチした文字列全体 $my_yy = (int) $matches[0][1]; //4桁年 $my_mm = (int) $matches[0][2]; //月 $my_dd = (int) $matches[0][3]; //日 /* 文字列が日付なのか判定 */ if ( (1970<=$my_yy) && ($my_yy<=2011) && (1<=$my_mm) && ($my_mm<=12) && (1<=$my_dd) && ($my_dd<=31) ) { echo $my_date; } else { echo '日付と思われる文字列は含まれていません。'; } }
その他の回答 (1)
×××× 2011年10月6日 ×××××× は「日」が1桁だから mb_ereg("([0-9]{4})年([0-9]{2,})月([0-9]{2,})日",$string,$result) に引っかかるわきゃないんですが。
お礼
返信ありがとうございました。 0~9までの半角数値が4桁続いた後に、「年」があって、その次に0~9までの半角数字が1~2桁、次に「月」があって、その次に0~9までの半角数字が1~2桁、次に「日」があるような部分を探しなさい、としたかったのです。 誤 {2,} → 正 {1,2} でした。 日が1桁というのは?
お礼
詳しい回答ありがとうございました。 正規表現と文字コードって、ひとつの壁だと思います。