1

PHPで正規表現を使用して、複数行のテキストボックスに貼り付けられ、処理のためにスクリプトに送信されたフォームレター(もちろん、既知の形式)を「リバースエンジニアリング」する良い例を探しています。

したがって、たとえば、これが元のプレーンテキスト入力(USDAプレスリリースから取得)であると仮定します。

ワシントン、2010年4月5日-ノースダコタ州ニューロックフォードのNorth American Bison Co-Opは、トンシルが完全に除去されていない可能性のある舌を含む約25,000ポンドの牛肉の頭全体をリコールしています。すべての年齢の牛からのトンシルの除去、米国農務省の食品安全検査局(FSIS)は本日発表しました。

わかりやすくするために、変数であるフィールドは以下で強調表示されています。

[pr_city =] WASHINGTON[pr_date=]2010年4月5日- [corp_name=]North American Bison Co-Op[corp_city =] New Rockford[corp_state =] ND、施設は約[amount=]25,000ポンドをリコールしています[product =]牛肉の頭全体に、トンシルが完全に除去されていない可能性があります。これは、 [理由=]すべての年齢の牛からのトンシルの除去を要求する規制に準拠していません。米国農務省の食品安全および本日発表された検査サービス(FSIS)。

どうすれば効率的にコンテンツを抽出できますか

  • pr_city
  • pr_date
  • corp_name
  • corp_city
  • corp_state
  • 製品
  • 理由

私の例のフィールド?

助けていただければ幸いです、ありがとう。

4

3 に答える 3

4

さて、あなたの例で機能する正規表現は次のようになります(この獣を読みやすくするために導入された改行は、使用する前に削除する必要があります):

/^(?P<pr_city>[^,]+), (?P<pr_date>[^-]+) - (?P<corp_name>.*?), a 
(?P<corp_city>[^,]+), (?P<corp_state>[^,]+), establishment is 
recalling approximately (?P<amount>.*?) of (?P<product>.*?), 
which is not compliant with regulations that require (?P<reason>.*?), 
the U\.S\. Department of Agriculture\'s Food Safety and Inspection 
Service \(FSIS\) announced today\.$/

したがって、PHPでは次のことができます

if (preg_match('/^(?P<pr_city>[^,]+), (?P<pr_date>[^-]+) - (?P<corp_name>.*?), a (?P<corp_city>[^,]+), (?P<corp_state>[^,]+), establishment is recalling approximately (?P<amount>.*?) of (?P<product>.*?), which is not compliant with regulations that require (?P<reason>.*?), the U\.S\. Department of Agriculture\'s Food Safety and Inspection Service \(FSIS\) announced today\.$/', $subject, $regs)) {
    $prcity = $regs['pr_city'];
    $prdate = $regs['pr_date'];
    ... etc.
} else {
    $result = "";
}

これは、いくつかのことを前提としています。たとえば、改行がないこと、入力が文字列全体である(この部分を抽出する必要のある大きな文字列ではない)ことです。私はある程度意味のある法的価値について仮定を立てようとしましたが、他の入力がこれを破る可能性が非常に高いです。したがって、おそらくさらにいくつかのテストケースが必要です。

于 2010-04-12T16:00:36.777 に答える
2

周囲のテキストが一定である場合、この部分的な正規表現のようなものでうまくいく可能性があります。

preg_match('/^(.*?), (.*?)- (.*?), a (.*?), (.*?), establishment is recalling approximately (.*?), which is not compliant with regulations that require (.*?), the U.S. Department of Agriculture's Food Safety and Inspection Service (FSIS) announced today./', $text, $matches);

$matches[1] = 'WASHINGTON';
$matches[2] = 'April 5, 2010';
$matches[3] = ... etc...

周囲のテキストが変更されると、大量の誤った一致、一致なしなどが発生します。基本的に、PRリリースを解析/理解するにはAIが必要です。

于 2010-04-12T16:00:55.443 に答える
1

編集: 他の2つが優れているので、このクレイジーな答えは無視してください。おそらく削除する必要がありますが、参考のために保管しています。

うまくいくかもしれないというクレイジーな考えがあります。マークアップを追加して入力からXML文字列を作成し、それを解析します。次のような(完全にテストされていない)コードのように見える場合があります。

preg_replace('([^,]*), ([^-]*)- ...etc...', '<pr_city>\1</pr_city><pr_date>\2</pr_date> ...etc...');

後でXMLを解析することは、不必要に複雑なプロセスであり、PHPのドキュメント(http://www.php.net/manual/en/function.xml-parse.php )に任せるのが最善です。

このメソッドを使用してJSONに変換し、json_decode()を使用して解析することも検討できます。"いずれにせよ、入力にマークや>記号が表示されたときに何が起こるかを考える必要があります。

一度に1つのテキストを一致させて削除する方が簡単な場合があります。

于 2010-04-12T16:00:59.703 に答える