如何在PHP中将属性字符串解析为数组?

时间:2015-05-12 18:41:14

标签: php arrays regex parsing html-parsing

在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中),如果我只传递属性部分,它将返回数组?

2 个答案:

答案 0 :(得分:2)

我知道你说你不喜欢正则表达式的解决方案,但我还是会给你一个:)至少人们可以比较任何其他可能的答案,而不是使用正则表达式。

你可以在这里看到并玩弄正则表达式: https://regex101.com/r/cT6bT0/1。 这将尝试在右上角解释你的正则表达式 - 标题为“解释”。

代码:

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

输出:

<slick prev-arrow=".slick-prev" next-arrow=".slick-next">

答案 1 :(得分:0)

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