用双引号提取字符串(字符串有双引号)

时间:2016-07-03 11:07:48

标签: php regex preg-match preg-match-all

我有一个字符串

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

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

我用key = value format

提取数据
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>
根据[地址] (我不擅长英语因此,句子中可能有错误)

请帮帮我

1 个答案:

答案 0 :(得分:0)

你可以使用像

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

请参阅regex demo

模式详情

  • /s是一个DOTALL修饰符,可使.匹配包含换行符的任何符号
  • /m修饰符使$与行尾相匹配
  • (\w+) - 第1组捕获1个或多个字母数字或下划线字符
  • \s* - 零个或多个空格
  • = - 等号
  • \s* - 0+ whitespaces
  • "(.*?)" - 双引号,零或多个除换行之外的任何字符,尽可能少到第一个双引号和此引号(第2组是在双引号之间捕获的)< / LI>
  • \s* - 零个或多个空格
  • (?=$|\w+\s*=) - 一个积极的预测,要求字符串的结尾出现在当前位置之后,或者一个或多个字母数字后跟零个或多个空格和等号。