2

100 個のファイルがあり、それぞれに x 量のニュース記事が含まれています。記事は、次の略語のセクションで構成されています。

HD BY WC PD SN SC PG LA CY LP TD CO IN NS RE IPC PUB AN

where [LP]and[TD]には任意の数の段落を含めることができます。

典型的なメッセージは次のようになります。

HD Corporate News: Alcoa Earnings Soar; Outlook Stays Upbeat 
BY By James R. Hagerty and Matthew Day 
WC 421 words
PD 12 July 2011
SN The Wall Street Journal
SC J
PG B7
LA English
CY (Copyright (c) 2011, Dow Jones & Company, Inc.) 

LP 

Alcoa Inc.'s profit more than doubled in the second quarter, but the giant 
aluminum producer managed only to meet analysts' recently lowered forecasts.

Alcoa serves as a bellwether for U.S. corporate earnings because it is the 
first major company to report and draws demand from a wide range of 
industries.

TD 

The results marked an early test of how corporate optimism is holding up 
in the face of bleak economic news.

License this article from Dow Jones Reprint 
Service[http://www.djreprints.com/link/link.html?FACTIVA=wjco20110712000115]

CO 
almam : ALCOA Inc

IN 
i2245 : Aluminum | i22 : Primary Metals | i224 : Non-ferrous Metals | imet 
  : Metals/Mining

NS 
c15 : Performance | c151 : Earnings | c1521 : Analyst 
Comment/Recommendation | ccat : Corporate/Industrial News | c152 : 
Earnings Projections | ncat : Content Types | nfact : Factiva Filters | 
nfce : FC&E Exclusion Filter | nfcpin : FC&E Industry News Filter

RE 
usa : United States | use : Northeast U.S. | uspa : Pennsylvania | namz : 
North America

IPC 
DJCS | EWR | BSC | NND | CNS | LMJ | TPT

PUB 
Dow Jones & Company, Inc.

AN 
Document J000000020110712e77c00035

各記事の後、新しい記事が始まる前に 4 つの改行があります。次のように、これらの記事を配列に入れる必要があります。

$articles = array(
  [0] = array (
    [HD] => Corporate News: Alcoa earnings Soar; Outlook...
    [BY] => By James R. Hagerty...
    ...
    [AN] => Document J000000020110712e77c00035
  )
)
4

1 に答える 1

3

爆発を使用して各ブロックを分離し、正規表現を使用してフィールドを抽出する方法:

$pattern = <<<'LOD'
~
# definition
(?<fieldname> (?:HD|BY|WC|PD|SN|SC|PG|LA|CY|LP|TD|CO|IN|NS|RE|IPC|PUB|AN)$ ){0}

# pattern
\G(?<key>\g<fieldname>) \s+
(?<value>
    .+ 
    (?: \R{1,2} (?!\g<fieldname>) .+ )*+
)
(?:\R{1,3}|\z)
~xm
LOD;
$subjects = explode("\r\n\r\n\r\n\r\n", $text);
$result = array();

foreach($subjects as $i => $subject) {
    if (preg_match_all($pattern, $subject, $matches, PREG_SET_ORDER)) {
        foreach ($matches as $match) {
            $result[$i][$match['key']]=$match['value'];
        }
    }
}
echo '<pre>', print_r($result, true);

パターンの詳細:

パターンは次の 2 つの部分に分かれています。

定義部分では、後でメイン パターンで使用するために、fieldnameという名前のサブパターンを作成しました。このパターンは、各フィールド名が$アンカーで行を終了することも確認します。

主なパターン:

\G                        # this forces the match to be contiguous to the
                          # precedent match or the start of the string (no gap)
(?<key> \g<fieldname> )   # a capturing group named "key" for the fieldname
\s+                       # one or more white characters
(?<value>                 # open a capturing group named "value" for the
                          # field content
    .+                    # all characters except newlines 1 or more times
    (?:                   # open an atomic group
        \R\R?+            # one or two newlines to allow paragraphs (LP & TD) 
        (?!\g<fieldname>) # but not followed by a fieldname (only a check)
        .+                #
    )*+                   # close the atomic group and repeat 0 or more times
)                         # close the capture group "value"
(?:\R{1,3}|\z)            # between 1 or 3 newlines max. or the end of the
                          # string (necessary if i want contigous matches)

グローバル修飾子:

  • x (拡張モード): パターン内で # で始まる空白とインライン コメントは無視されます。
  • m (複数行モード): 行頭と行末を^一致させます。$
于 2013-08-19T17:03:10.820 に答える