• ベストアンサー

目的の文字列を取得するには?

×××× 2011年10月6日 ×××××× というような文字列から日付の部分を取り出そうとしています。 if (mb_ereg("([0-9]{4})年([0-9]{2,})月([0-9]{2,})日",$string,$result)){ echo $result; } という方法で取得しようとしているのですが、失敗します。 半角数字と全角の漢字が混在しているような文字列から、目的の部分を取得する にはどうすればいいでしょうか?

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

  • ベストアンサー
  • 4017B
  • ベストアンサー率73% (1336/1814)
回答No.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 '日付と思われる文字列は含まれていません。'; } }

dv8hjkwf
質問者

お礼

詳しい回答ありがとうございました。 正規表現と文字コードって、ひとつの壁だと思います。

その他の回答 (1)

noname#158634
noname#158634
回答No.1

×××× 2011年10月6日 ×××××× は「日」が1桁だから mb_ereg("([0-9]{4})年([0-9]{2,})月([0-9]{2,})日",$string,$result) に引っかかるわきゃないんですが。

dv8hjkwf
質問者

お礼

返信ありがとうございました。 0~9までの半角数値が4桁続いた後に、「年」があって、その次に0~9までの半角数字が1~2桁、次に「月」があって、その次に0~9までの半角数字が1~2桁、次に「日」があるような部分を探しなさい、としたかったのです。 誤 {2,} → 正 {1,2} でした。 日が1桁というのは?

関連するQ&A