如何使用 preg_match_all 使用正则表达式模式将字符串转换为数组

How to turn strings into arrays using regex pattern using preg_match_all

如何将下面的挑战字符串分隔成具有正则表达式模式的数组?

例如:

$str = '{varA: "value, A", varB: "value:B", varC: "value C", varD: "value\"D\""}';

// remove both curved brackets
$trimStr = substr($str, 1, strlen($str)-1);
preg_match_all("/(.*?):\"(.*?)\",/sm", $trimStr, $m);  // would like the regex to ignore the ',' and double quote in the value string too

进入一个数组,其中

arr[0] = 'varA: "value, A"';
arr[1] = 'varB: "value:B"';
arr[2] = 'varC: "value C"';
arr[3] = 'varC: "value \"D\""';

在您的示例中,您似乎根本不需要使用正则表达式,只需删除大括号并将字符串分解为数组即可。由于您的元素已经用逗号分隔,只需使用正确的分隔符即可。

$arr = explode(', ', $str);

但是,如果您坚持使用正则表达式,这里有一个表达式可以匹配您的元素:

var\w+\:\s\".+?(?=\,|})

/(.*?):\"(.*?)\",/sm => /{?((.*?): ?"(.*?)")[,}]/ try regex

PHP代码:

$str = '{varA: "value A", varB: "value:B", varC: "value C", varD: "value"D""}';
$pattern = '/{?((.*?): ?"(.*?)")[,}]/';
$arr = [];

preg_match_all($pattern, $str, $matches);
foreach($matches[1] as $match){
  $arr[] = $match;
}
print_r($arr);

您需要在 :" 之间提供可选间距,并且您需要将定界符更改为 , 或行尾。

(.*?):\h*\"(.*?)\"(?:,|$)

https://regex101.com/r/aAyrQA/1/

或:

\{?(.*?):\h*\"(.*?)\"(?:,|\}|$)

您可以删除 $trimStr = substr($str, 1, strlen($str)-1);

完整 PHP 示例:

preg_match_all('/\{?(.*?):\h*\"(.*?)\"(?:,|\}|$)/', '{varA: "value, A", varB: "value:B", varC: "value C", varD: "value\"D\""}', $matches);
foreach($matches[1] as $key => $match) {
    $arr[] = $match . ' :"' . $matches[2][$key] . '"';
}

https://3v4l.org/0nJqW