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


Parsing name value pairs from long string using regular expressions

正则表达式肯定会让我回到现实。我想我从来没有在没有帮助的情况下制作过一个,所以这里有另一个请求帮助的呼声。下面是示例输入:

{{Taxobox | name = Impala | status = LC | status_system = IUCN3.1 |status_ref = {{IUCN2008|assessors=IUCN SSC羚羊专家组|year=2008|id=550|title=Aepycerosmelampus| downloads =18 January 2009}为什么这个物种最不受关注的理由|趋势=稳定| image =塞伦盖蒂黑斑羚3.jpg | image_caption=年轻雄性[[塞伦盖蒂]],[[坦桑尼亚]]的黑斑羚| image2=Female_impala.jpg |[[Mikumi国家公园]]的雌性黑斑羚,[[坦桑尼亚]]| regnum =[[动物]]ia |门=[[脊索动物|脊索动物]]| classis =[[哺乳动物]]ia | ordo =[[偶蹄目动物|偶蹄目]]| familia = [[Bovid]]ae | subfamilia = " 'Aepycerotinae''subfamilia_authority =[[约翰·爱德华·格雷|格雷]],1872'''''Aepyceros''''' | genus_authority = [[Carl Jakob .Sundevall|Sundevall]], 1847 | species = '''''A. melampus''''' |subdivision_ranks =亚种| subdivision = * " [[Aepyceros .melampus petersi |。m . petersi]]"* " A. m. melampus " | range_map=Leefgebied_impala.JPG | range_map_caption=Range map |二项= " Aepyceros melampus " |binomial_authority = ([[Martin Lichtenstein|Lichtenstein]], 1812) |range_map = Impala.png | range_map_caption =图片的分布黑斑羚
红色=A。m. melampus
Blue = A. m. petersi}}

对不起,我无法以更好的方式格式化此内容。它是一个没有换行符的长字符串。它本质上是一组名称-值对。每对格式:

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

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

我要做的是把它变成PHP中的关联数组。不管它的价值是什么,下面是我至少试图找到一些匹配的尝试:

$pattern = "/'|([^=|^.]*)=([^'|]*)|/s";
if (preg_match_all($pattern, $pagecontent, $matches)) {
var_dump($matches);
} else echo "no match!";
这是一种方式,所以不要太在意它。

在尝试提取对之前,需要将包含的字符串与{{}}分隔符隔离。这将在您的示例中失败,因为看起来像与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]);

单独的名称标记当然没有关联的值