3

自由形式のテキストで日付を見つけるための最良のアプローチは何でしょうか?ユーザーが次のようないくつかの異なる方法で日付を配置できる投稿。

  1. 7月14日と15日
  2. 7/14&7/15
  3. 7-14&7-15
  4. 14日(土)と15日(日)
  5. 7月14日と15日土曜日

等々。正規表現は、このタイプのものに対する私の最良の選択preg_matchですか?また、開始日と終了日の2つの日付があるかどうかを検索したいのですが、検索するテキストには1つまたは2つの日付がある可能性があります。

これはこれまでの私のPHPコードです:

$dates1 = '01-01';
$dates2 = 'July 14th & 15th';
$dates3 = '7/14 & 7/15';
$dates4 = '7-14 & 7-15';
$dates5 = 'Saturday 14th and Sunday 15th';
$dates6 = 'Saturday July 14th and 15th';

$regexes = array(
        '/\s(1|2|3|4|5|6|7|8|9|10|11|12)\/\d{1,2}/',  //finds a date
        '/\s(1|2|3|4|5|6|7|8|9|10|11|12)-\d{1,2}/',  //finds another date
        '%\b(0?[1-9]|[12][0-9]|3[01])[- /.](0?[1-9]|1[012])\b%', //finds date format dd-mm or dd.mm
        );
foreach($regexes as $regex){
preg_match($regex,$dates,$matches);
}
var_dump($matches);
4

4 に答える 4

0

解析しようとしているテキストには、関心のある日付テキストのみが含まれていると思います。その場合、UIを変更して、2つの日付が必要な場合は、2つのテキストフィールドを入力する必要があります。これにより、それらを分離する方法を理解するという問題が解消されます。

そして今、テキストに1つの日付があるので、テキスト全体をに渡しますstrtotime()。これで2番目の問題が解決します。ナンセンスが戻ってきた場合(そしてstrtotime()それがナンセンスかどうかを教えてくれます)、与えられた日付を理解できなかったことをユーザーに伝えることができます。

于 2012-07-11T03:18:47.807 に答える
0

ここに、あまり洗練されていないブルートフォースソリューションを使用した非常に類似した質問に対するPerlの回答があります: 文字列から一貫性のない形式の日付を抽出する(日付解析、NLP)

基本的なアプローチは、自由形式のテキストを日付である可能性のある連続した文字のチャンクに分割し、それらの文字が有効な日付として解析されるかどうかを確認することです。Perlでは、Date :: Parseモジュールを(ab)使用してそれを行うことができます。PHPに任意の自由形式の日付を解析する同等のモジュールがない場合は、いくつかのregexenで近似できます。

于 2012-07-11T03:19:09.120 に答える
0

PHPには、タイムスタンプを管理するDateTimeというクラスがあります。文字列とDateTimeオブジェクトを非常に簡単に変換できます...文字列がPHPが提供する形式を使用している場合。

例えば、

$date = DateTime::createFromFormat('d-m', '01-01');
$date = DateTime::createFromFormat('F d', 'July 14');
$date = DateTime::createFromFormat('d-M-Y', '15-Feb-2009');

そうは言っても、これが私がすることです:

優先度の高い順に、受け入れ可能な形式の配列を作成します。

$formats = array("d-m", "j-M-Y" ... );

正規表現を使用して入力をマッサージし、フォーマットと一致するようにします。

// Add the current year to this one:
$dates1 = '01-01';

// Split these into "July 14" and "July 15", and add the year
//  (this one will be the toughest)
$dates2 = 'July 14th & 15th';

// Split these into "7/14" and "7/15", and add the year
$dates3 = '7/14 & 7/15';

// Split these into "7-14" and "7-15", and add the year
$dates4 = '7-14 & 7-15';

// Split these, and add a month and year
$dates5 = 'Saturday 14th and Sunday 15th';

// Split these, and add a year:
$dates6 = 'Saturday July 14th and 15th';

DateTimeオブジェクトを作成してみてください。

$date = false;
foreach ($formats as $format)
{
    $date = DateTime::createFromFormat($format, $dateString);
    if ($date) break;
}
于 2012-07-11T03:30:24.277 に答える
0

PHPが有効と見なす日付形式を見てください:http://us.php.net/manual/en/datetime.formats.date.php

理想的には、日付を分離してから使用することをお勧めしstrtotime()ますが、それはオプションではないため、困難な場所で立ち往生しています。サポートするすべての形式を定量化し、すべてのベースをカバーする正規表現のセットを作成する必要があります。上記のリストは、開始するのに適した場所です。

ただし、日付の意味を推測するのは難しいでしょう1/2/2005... 1月2日ですか、それとも多くの地域で標準的な2月1日ですか?あいまいな場合は、手動で評価するために、それらを破棄するか、どこかに送信する必要があります。

于 2012-07-11T03:30:39.107 に答える