我正试图在接下来的2周内完成一个PHP应用程序,但我只是找不出解析某些属性字符串的正则表达式。
我得到了如下字符串格式的随机字符串:
KeyName1="KeyValue1" KeyName2='KeyValue2'一个字符串中可能有任意数量的键值对,并且在一个字符串中的任何组合中,这些值都可以由单引号'或双引号"分隔(但它们总是被分隔)。
键值可以是任意长度的,包含除双引号以外的任何字符,双引号不能在双引号内,单引号不能在单引号内,双引号可以在单引号内,单引号可以在双引号内。
键值对之间可以有任意数量的空格,键名与等号和等号之间也可以有任意数量的空格,以及开始键值的引号字符。
我需要将字符串转换为如下所示的数组:
$arrayName["KeyName1"] = "KeyValue1"
$arrayName["KeyName2"] = "KeyValue2"等。
我确信正则表达式是可以完成的,但是我的所有尝试都失败了,我需要一些帮助(实际上是很多帮助:-)来完成这个任务,我希望这里的一些了不起的人能够提供帮助,或者至少让我开始工作。
发布于 2013-06-09 08:09:15
好的,没问题。让我们把它分解:
\w+\s*=\s*匹配字母数字关键字,后面跟着等号(可能被空格包围)。
"[^"]*"匹配一个开头双引号,后面跟着除另一个双引号以外的任意数量的字符,然后是(结束)双引号。
'[^']*'对于单引号字符串也是如此。
将使用捕获组((...))与简单选择(|)组合在一起,您将
(\w+)\s*=\s*("[^"]*"|'[^']*')在PHP中:
preg_match_all('/(\w+)\s*=\s*("[^"]*"|\'[^\']*\')/', $subject, $result, PREG_SET_ORDER);用匹配数组填充$result。$result[n]将包含n第四次匹配的详细信息,其中
$result[n][0]是整个匹配$result[n][1]包含关键字$result[n][2]包含值(包括引号)编辑:
要匹配不带引号的值部分,无论使用哪种引号,您都需要一个稍微复杂一些的正则表达式,它使用正前瞻断言。
(\w+)\s*=\s*(["'])((?:(?!\2).)*)\2在PHP中:
preg_match_all('/(\w+)\s*=\s*(["\'])((?:(?!\2).)*)\2/', $subject, $result, PREG_SET_ORDER);与结果
$result[n][0]:完全匹配$result[n][1]:关键字$result[n][2]:引号字符$result[n][3]:价值Explanation:
(["']) # Match a quote (--> group 2)
( # Match and capture --> group 3...
(?: # the following regex:
(?!\2) # As long as the next character isn't the one in group 2,
. # match it (any character)
)* # any number of times.
) # End of capturing group 3
\2 # Then match the corresponding quote character.https://stackoverflow.com/questions/17007616
复制相似问题