首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >正则表达式来匹配值以引号或撇号表示的键值对。

正则表达式来匹配值以引号或撇号表示的键值对。
EN

Stack Overflow用户
提问于 2013-06-09 07:59:26
回答 4查看 5K关注 0票数 4

我正试图在接下来的2周内完成一个PHP应用程序,但我只是找不出解析某些属性字符串的正则表达式。

我得到了如下字符串格式的随机字符串:

代码语言:javascript
运行
复制
KeyName1="KeyValue1" KeyName2='KeyValue2'

一个字符串中可能有任意数量的键值对,并且在一个字符串中的任何组合中,这些值都可以由单引号'或双引号"分隔(但它们总是被分隔)。

键值可以是任意长度的,包含除双引号以外的任何字符,双引号不能在双引号内,单引号不能在单引号内,双引号可以在单引号内,单引号可以在双引号内。

键值对之间可以有任意数量的空格,键名与等号和等号之间也可以有任意数量的空格,以及开始键值的引号字符。

我需要将字符串转换为如下所示的数组:

代码语言:javascript
运行
复制
$arrayName["KeyName1"] = "KeyValue1"
$arrayName["KeyName2"] = "KeyValue2"

等。

我确信正则表达式是可以完成的,但是我的所有尝试都失败了,我需要一些帮助(实际上是很多帮助:-)来完成这个任务,我希望这里的一些了不起的人能够提供帮助,或者至少让我开始工作。

EN

Stack Overflow用户

回答已采纳

发布于 2013-06-09 08:09:15

好的,没问题。让我们把它分解:

代码语言:javascript
运行
复制
\w+\s*=\s*

匹配字母数字关键字,后面跟着等号(可能被空格包围)。

代码语言:javascript
运行
复制
"[^"]*"

匹配一个开头双引号,后面跟着除另一个双引号以外的任意数量的字符,然后是(结束)双引号。

代码语言:javascript
运行
复制
'[^']*'

对于单引号字符串也是如此。

将使用捕获组((...))与简单选择(|)组合在一起,您将

代码语言:javascript
运行
复制
(\w+)\s*=\s*("[^"]*"|'[^']*')

在PHP中:

代码语言:javascript
运行
复制
preg_match_all('/(\w+)\s*=\s*("[^"]*"|\'[^\']*\')/', $subject, $result, PREG_SET_ORDER);

用匹配数组填充$result$result[n]将包含n第四次匹配的详细信息,其中

  • $result[n][0]是整个匹配
  • $result[n][1]包含关键字
  • $result[n][2]包含值(包括引号)

编辑:

要匹配不带引号的值部分,无论使用哪种引号,您都需要一个稍微复杂一些的正则表达式,它使用正前瞻断言

代码语言:javascript
运行
复制
(\w+)\s*=\s*(["'])((?:(?!\2).)*)\2

在PHP中:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
(["'])    # 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.
票数 7
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17007616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档