2016-07-03 50 views
1

我有一個字符串提取字符串(有在串對雙引號)

$sting= 
' [ 
     type="user" 
     name="ali" 
     key="#$WRE" 

     //problem 
     address="{ 
      "type":"hellow" 
     }" 
    ]'; 

和我提取與鍵=值格式

for (;;) { 
if(!preg_match('~([A-Za-z0-9]+)\=\"([^\"]*)\"~m', $string,$match)){ 
    break; 
} 
$string=str_replace($match[0], '', $string); 

$dataArray[$match[1]]=$match[2]; 
} 

echo "<br><pre>"; 
print_r($dataArray); 
echo "<br></pre>"; 

但輸出數據

<br><pre>Array 
 
(
 
    [type] = user 
 
    [name] = ali 
 
    [key] = #$WRE 
 
    [address] = { 
 
\t \t \t \t 
 
) 
 
<br></pre>
根據[地址S] (IM的英語不是很好出於這個原因,有可能是將文中的錯誤)

請幫我

+0

你喜歡嘗試自己去解析JSON? – Iceman

+0

@Iceman這不是標準的JSON。如果它是JSON,地址字段不應該有* surround *'「'@Mortaza這真的是你的輸入的樣子嗎? – ClasG

+0

@ClasG我意識到這一點,但確認它是否是錯誤的粘貼! – Iceman

回答

0

您可以像使用

'/(\w+)\s*=\s*"(.*?)"\s*(?=$|\w+\s*=)/ms' 

正則表達式見regex demo

花紋細節

  • /s是DOTALL改性劑,使.匹配包括換行符
  • /m改性劑使得$匹配線
  • (\w+)的端部的任何符號 - 組1捕捉1個或更多的字母數字或下劃線字符
  • \s* - 零個或多個空格
  • = - 等號
  • \s* - 0+空格
  • "(.*?)" - 雙引號,零或多個除換行符以外的任何字符儘可能少至第一個雙引號和此引號(第2組是在雙引號之間捕獲的內容)
  • \s* - 零或多個空格
  • (?=$|\w+\s*=) -a正先行要求字符串的末尾出現的當前位置或一個或多個字母數字後向右依次與零個或多個空格和一個等號。
+0

非常感謝你 –

+0

現在更清潔,但沒有優化。 –

相關問題