使用正则表达式从长字符串解析名称值对

时间:2011-12-22 20:13:24

标签: php regex

正则表达式是让我回到地球的可靠方法。我不认为我曾经没有帮助过,所以这是另一个求助的呼声。这是示例输入:

  

{{Taxobox | name = Impala | status = LC | status_system = IUCN3.1 |   status_ref = {{IUCN2008 |评估员= IUCN SSC羚羊   专家组|年= 2008 | id = 550 | title = Aepyceros   melampus |已下载= 2009年1月18日}}数据库条目包括简要说明   为什么这个物种最不受关注的理由趋势=   稳定| image = Serengeti Impala3.jpg | image_caption =年轻男性   [[塞伦盖蒂]],[[坦桑尼亚]] |中的黑斑羚image2 = Female_impala.jpg |   image2_caption = [[米库米国家公园]]中的雌性黑斑羚],   [[坦桑尼亚]] | regnum = [[动物]] ia |门= [[Chordate | Chordata]]   | classis = [[哺乳动物]] ia | ordo = [[偶蹄动物有蹄类动物|偶蹄动物]]   | familia = [[Bovid]] ae | subfamilia ='''Aepycerotinae'''|   subfamilia_authority = [[John Edward Gray | Gray]],1872 |属=   '''''Aepyceros'''''| genus_authority = [[Carl Jakob   Sundevall | Sundevall],1847 | species ='''''A。 melampus'''''|   subdivision_ranks =亚种| subdivision = *''[[Aepyceros   melampus petersi | A.米petersi]] ''   * ''一个。米melampus''| range_map = Leefgebied_impala.JPG | range_map_caption =范围映射|二项式=''Aepyceros melampus''|   binomial_authority =([[Martin Lichtenstein | Lichtenstein]],1812)|   range_map = Impala.png | range_map_caption =分布   Impala
红= A。米melampus
蓝色= A. m。 petersi}}

抱歉,我无法以更好的方式进行格式化。它是一个很长的字符串,没有新行。它本质上是一组名称 - 值对。每对格式:

管道空间属性名称空间等于空间属性值空间

除了下一对的管道之外,一对没有明显的结束字符。

我想做的是将其转换为PHP中的关联数组。对于它的价值,这是我尝试至少尝试找到一些匹配的尝试:

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

这样做不要过分关注它。我希望有一些正则表达的大师来帮助我。

1 个答案:

答案 0 :(得分: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]);

孤独的名字令牌当然没有得到相关价值。