簡體   English   中英

使用正則表達式解析長字符串中的名稱/值對

[英]Parsing name value pairs from long string using regular expressions

正則表達式是將我帶回現實的可靠途徑。 我想我從來沒有在沒有幫助的情況下制作過一個,所以這里又是一個尋求幫助的呼聲。 這是示例輸入:

{{Taxobox | 名稱= Impala | 狀態= LC | status_system = IUCN3.1 | status_ref = {{IUCN2008 | assessors = IUCN SSC羚羊專家組| year = 2008 | id = 550 | title = Aepyceros melampus | downloaded = 2009年1月18日}}數據庫條目中包含了為什么該物種最不值得關注的簡要說明| 趨勢=穩定| 圖片=塞倫蓋蒂Impala3.jpg | image_caption = [[塞倫蓋蒂]],[[坦桑尼亞]]中的年輕雄性黑斑羚| image2 = Female_impala.jpg | image2_caption = [[Mikumi國家公園],[[坦桑尼亞]]中的母黑斑羚| regnum = [[動物]] ia | phylum = [[Chordate | Chordata]] | classis = [[哺乳動物]] ia | ordo = [[甚至有蹄類有蹄類動物|木偶蟲]] | 家族= [[Bovid]] ae | subfamilia ='''Aepycerotinae''| | subfamilia_authority = [[[約翰·愛德華·格雷|灰色]],1872年| 屬='''''Aepyceros'''''| | genus_authority = [[Carl Jakob Sundevall | Sundevall]],1847年| 物種='''''A. melampus'''''| subdivision_ranks =亞種| 細分= *” [[[Aepyceros melampus petersi | A。 petersi]]''*''A. melampus''| range_map = Leefgebied_impala.JPG | range_map_caption =范圍地圖| 二項式=“ Aepyceros melampus” | binomial_authority =([[[馬丁·利希滕斯坦|利希滕斯坦]],1812年)| range_map = Impala.png | range_map_caption = Impala的分布
紅色= A。 黃lamp
藍色=上午 彼得斯}}

對不起,我無法以更好的方式格式化它。 這是一個很長的字符串,其中沒有換行符。 它實質上是一組名稱-值對。 每對格式:

管道空間屬性名稱空間等於空間屬性值空間

除了下一對的管道,對沒有明顯的結束符。

我想做的是將其轉換為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]);

當然,隨着孤獨的名字令牌沒有獲得相關的價值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM