ai didi

php - 用于匹配值在引号或撇号中的键值对的正则表达式

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:03:05 24 4
gpt4 key购买 nike

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

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

KeyName1="KeyValue1" KeyName2='KeyValue2'

单个字符串中可以有任意数量的键值对,值可以用单引号' 或双引号" 以任意组合分隔字符串(但它们始终被分隔)。

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

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

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

$arrayName["KeyName1"] = "KeyValue1"
$arrayName["KeyName2"] = "KeyValue2"

等等

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

最佳答案

当然,没问题。让我们分解一下:

\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] 包含值(包括引号)

编辑:

要匹配不带引号的值部分,无论使用哪种引号,您都需要一个稍微复杂一点的正则表达式,它使用 positive lookahead assertion :

(\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]: 值

解释:

(["'])    # 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.

关于php - 用于匹配值在引号或撇号中的键值对的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17007616/

24 4 0
文章推荐: php,包含使用continue语句的文件
文章推荐: c++ - 计算不相交集合中的成员数
文章推荐: objective-c - UISlider 减少 UIImage 的 alpha
文章推荐: php - 如何在 preg_replace php 中进行数学运算
塔克拉玛干
个人简介

我是一名优秀的程序员,十分优秀!

滴滴打车优惠券免费领取
滴滴打车优惠券
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com