2011-12-22 11 views
0

正規表現は私を地球に戻す確実な方法です。私は今まで助けを借りずに生産してきたとは思わないので、もう一つの援助の叫びがあります。ここに入力例があります:正規表現を使用して長い文字列から名前の値のペアを解析する

{{Taxobox |名前=インパラ|ステータス= LC | status_system = IUCN3.1 | STATUS_REF = {{IUCN2008 |査定= IUCN SSCアンテロープ 専門家グループ|年= 2008 | ID = 550 |タイトル= Aepyceros メラムプース|ダウンロード= 2009年1月18日}}データベースのエントリは、この種はである理由を簡単に 正当性を含んでいます最も懸念される|トレンド= 安定性| image =セレンゲティImpala3.jpg | image_caption =若い男性 [[Serengeti]]、[[Tanzania]]のインパラ| image2 = Female_impala.jpg | image2_caption = [ミクミ国立公園]の女性インパラ、 [[タンザニア]] | regnum = [[Animal]] ia |門= [[Chordate | Chordata]] | classis = [[Mammal]] ia | ordo = [[Even-toed ungulate |偶蹄目動物]] | familia = [[Bovid]] ae |サブファミリア= '' 'アペリセティーナ' '' | subfamilia_authority = [[John Edward Gray | Gray]]、1872 |属= '' '' 'Aepyceros' '' '' | genus_authority = [[Carl Jakob Sundevall | Sundevall]]、1847年|種= '' '' 'A. melampus '' '' '| subdivision_ranks =亜種|下位区分= * '[[Aepyceros melampus petersi | A。 m。 petersi]] '' * '' A. m。メランパス '' | range_map = Leefgebied_impala.JPG | range_map_caption =範囲マップ|二項式= '' Aepyceros melampus '' | binomial_authority =([Martin Lichtenstein | Lichtenstein]]、1812年)| range_map = Impala.png | range_map_caption = の配信インパラ
赤= A。 m。メランパス
青= A.m。 petersi}}

申し訳ありません申し訳ありませんが、これをより良い方法でフォーマットできません。長い文字列で、改行はありません。基本的に名前と値のペアのセットです。各ペア形式:スペースattributeNameのスペースに等しい

パイプスペースの属性値のスペース

次のペアのパイプ以外のペアに明らかな終了文字は、ありません。

私がしたいのは、これをPHPの連想配列にすることです。何が価値があるために、ここでは、少なくともいくつかの一致を検索しようとしているの私の試みです:

$pattern = "/\|([^=|^.]*)=([^\|]*)|/s"; 
if (preg_match_all($pattern, $pagecontent, $matches)) { 
var_dump($matches); 
} else echo "no match!"; 

それはそれにあまりにも多くの注意を払っていないの方法です。私はここで私を助ける正規表現のマスターを希望しています。

答えて

1

ペアを抽出する前に、含まれている文字列を{{}}の区切り記号から分離する必要があります。 status_ref={{...}}でネストされたグループ化のように見えるため、これはあなたの例では失敗します。これにはpreg_replace_callbackと(?R)パターンが必要です。

このような正規表現は、しかし、ペア自身のために働くかもしれない

"/(?<=^| \|) # start, of string, or after any | 
    \s*(\w+)  # name 
    (?:\s*=\s*( # = 
    \{\{.*?\}\} # {{....}} 
    | \[\[.*?\]\] # [[...]] 
    | \(.*?\)  # (...) 
    | [^|]+))? # plain values 
/sx" 

それはであなたの連想配列を与える:孤独な名前トークンはの関連する値を取得しないで

$array = array_combine($matches[1], $matches[2]); 

コース。

+0

あなたの答えをありがとう。私はすべての余分なヒントをまとめる方法を完全に理解していません。そのままの形でパターンを実行すると、いくつかのペアが生成されますが、空の値ストリングを持つ名前だけでなく、「名前」側の値も上がります。コールバックがその解決策を提供していると言っていますか?どうやって? – Ferdy

+0

ネスティングを維持する必要はないと言えるのですか?フラットな名前と値のペア配列を探しています。値に中括弧が含まれていてもかまいませんが、好きではありません。 – Ferdy

+0

セカンドルックでは、入力がより複雑な文法を持っています。それはコールバックまたは?Rのアプローチで行うことができますが、それはあなたには複雑すぎます、私にとってはあまりにも多くの努力をしています。編集に表示されているように例外を追加して手動でトラバースして分割することもできます。しかし、それは私がここで助けることができるすべてです。 – mario

関連する問題