提取双引号中的字符串(字符串处有一对双引号)

extract string in double quotation(there are pair double quotations at string)

我有一个字符串

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

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

并且我使用 key=value 格式提取数据

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] = {
    
)
<br></pre>
根据[地址] (本人英文不好,所以可能句子有误)

请帮帮我

您可以使用像

这样的正则表达式
'/(\w+)\s*=\s*"(.*?)"\s*(?=$|\w+\s*=)/ms'

regex demo

图案详情:

  • /s 是一个 DOTALL 修饰符,它使 . 匹配任何符号,包括换行符
  • /m修饰符使$匹配行尾
  • (\w+) - 第 1 组捕获 1 个或多个字母数字或下划线字符
  • \s* - 零个或多个空格
  • = - 等号
  • \s* - 0+ 个空格
  • "(.*?)" - 双引号,零个或多个除换行符以外的任何字符,尽可能少,直到第一个双引号和这个引号(第 2 组是在双引号之间捕获的字符)
  • \s* - 零个或多个空格
  • (?=$|\w+\s*=) - 正先行要求字符串的结尾紧跟在当前位置之后或一个或多个字母数字后跟零个或多个空格和等号。