【问题标题】:How can I parse an attribute string to an array in PHP?如何在 PHP 中将属性字符串解析为数组?
【发布时间】:2015-07-23 19:21:53
【问题描述】:

在 PHP 中,我需要解析字符串中的参数,例如:

{keyword name1=val1 name2='val2' name3="val3"}

最终得到如下数组:

{
  name1 => "val1",
  name2 => "val2",
  name3 => "val3"
}

每个值可能被引用也可能不被引用,并且可以使用单引号或双引号引起来。此外,值可能包含空格、标点符号甚至相反的引号。例如,这可能是一个有效的属性:

name1="Isn't this OK?"

理想情况下,它还允许在值内使用转义引号,但这只是一个奖励。我希望有一个功能,就像HTML 浏览器解析器在解析HTML 标记上的属性时所做的那样。

我的第一个想法是一次遍历一个字符的字符串,检查等号后面的字符是否是引号,然后寻找下一个匹配的引号。但这似乎很乏味,并不是解析字符串的最有效方法。

我看到的使用正则表达式的例子都超出了我的想象,难以理解,而且对我来说太复杂而无法维护。

我也看到了使用 DOMdocument 的示例,但是当值中有空格或逗号时,它们无法正确解析。

我需要在PHP 中执行此操作,而不是Javascript

是否有一个函数(在PHP 中)如果我只传递属性部分,它将返回数组?

【问题讨论】:

  • name1 name2 是正规的吗?

标签: php arrays regex parsing html-parsing


【解决方案1】:

我知道你说你不喜欢正则表达式解决方案,但无论如何我都会给你一个 :) 至少人们可以在这里与不使用正则表达式的任何其他可能的答案进行比较。

您可以在此处查看并使用正则表达式: https://regex101.com/r/cT6bT0/1。 这将尝试在右上角向您解释正则表达式 - 标题为“解释”。

代码:

// For demonstration is use heredoc for input string so that i escape of quotes is not necesarry.
$input = <<<END
{keyword name1=val1 name2='val2' name3="val3" name4="Isn't this OK?" name5=okay name6='Isn\'t' name7="A \"quote\""}
END;

$re = "/(?:\\s*(\\w+)\\s*=\\s*(?:'((?:[^'\\\\]|\\\\')*)'|\"((?:[^\"\\\\]|\\\\\")*)\"?|(\\w+)))/"; 

preg_match_all($re, $input, $parts, PREG_SET_ORDER);

$result=[];

foreach ($parts as $part) {
    $result[$part[1]] = stripslashes($part[2] ? $part[2] : ($part[3] ? $part[3] : $part[4])) . "\n";
}

print_r($result);

输出:

Array
(
    [name1] => val1
    [name2] => val2
    [name3] => val3
    [name4] => Isn't this OK?
    [name5] => okay
    [name6] => Isn't
    [name7] => A "quote"
)

【讨论】:

  • allenmc,太棒了!非常感谢!!我可能不明白使用的正则表达式,但链接的示例解释了很多,并减轻了我对维护它的恐惧。
【解决方案2】:

使用addslashes() 之类的函数来转义引号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-25
    • 2012-03-29
    • 2014-04-17
    • 1970-01-01
    • 1970-01-01
    • 2017-06-23
    相关资源
    最近更新 更多