質問: [ '/(?:(2[0-3])|([0-1][0-9])):([0-5][0-9])/', //H:i '/(?:(2[0-3])|([0-1][0-9]))\時([0-5][0-9])\分/' //H時:i分 ]; foreach ($datePts as $pts) { preg_match($pts, $rawData, $date); } foreach ($timePts as $pts) { preg_match($pts, $rawData, $time); } ``` 正規表現の書き方が悪いのだと思いますが例文で実行すると1の例文ですとデータは何も取得できず、2の例文ですと時間だけ取得出来るのですが、サブマッチで空白のサブマッチが取得出来てしまいます。 正しく正規表現で文字を抽出出来るように。正しい正規表現の書き方を教えて頂けないでしょうか?よろしくお願いします。
回答: 例示のテキストにはみあたらないyearやらmonthやらdayが正規表現の方で記載されているのですが 実際の例示のテキストには挿入されているのでしょうか? sample ====== 手を抜いていいならこんな感じ ``` $pattern="/(\d{4}[年\/]\d{1,2}[月\/]\d{1,2}日*).+?(\d{1,2}[:時]\d{1,2}分*)/u"; $str="1.「明日は2017年1月29日です。現在の時刻は14:58です」"; if(preg_match($pattern,$str,$m)){ print $m[1].",".$m[2].""; } $str="2.「明日は2017/01/29です、現在時刻は14時58分です」 "; preg_match($pattern,$str,$m); if(preg_match($pattern,$str,$m)){ print $m[1].",".$m[2].""; } ``` ただし上記patternだと $str="3.「明日は2017/01月29です、現在時刻は14:58分です」 "; のような中途半端なものにもマッチしますので、きちんとやるなら以下のように場合分けが必要です $pattern="/(\d{4}年\d{1,2}月\d{1,2}日|\d{4}\/\d{1,2}\/\d{1,2}).+?(\d{1,2}時\d{1,2}分|\d{1,2}[:]\d{1,2})/u";