首页 > 解决方案 > PHP中简码的正则表达式

问题描述

我不知道问题的标题应该是什么。这是合乎逻辑的东西和我所缺乏的东西是一样的。

我有一个格式的字符串,[CONST att1="value1" att2="value2"]并创建了一个运行良好的正则表达式。但是某些条件使这个正则表达式出错。

$data = preg_split('/(?<=\")\s/', $replace_str[1]);
foreach ($data as $index_val => $exp_data) {
    if(!empty($exp_data)){
        $attributes = explode('=',$exp_data);
        if(count($attributes) > 0){
            $index = strtolower(str_replace(array("'", "\""), "", trim($attributes[0])));
            $item_value = str_replace(array("'", "\""), "", trim($attributes[1]));
            $item_value = $attributes[1];
            $array_data[$index] = $item_value;
        }
    }
}

然后使用数组获取键值。但在某些情况下,假设格式如下所示

[CONST att1="value1" att2= "value2"]

分解后的变量包含 "value2"(注意前缀空格)。我想要的是"value2"

因此,由于我的格式类似于 WordPress 短代码的格式,因此在 WordPress 中引用了shortcode.php文件并在文件中找到@[<>&/\[\]\x00-\x20=]@。但我无法理解或使其工作。

我需要访问value1value2作为干净的数据。即,没有空格,开始和结束的单引号和双引号。att1此外,如果and的顺序att2发生变化,它应该可以工作。

[CONST att2="value2" att1="value1"]

应该输出:

数组(att1=>value1,att2=>value2)

标签: phpregex

解决方案


preg_match_all我建议使用与like匹配的正则表达式收集短代码字符串中的键和值

'~(?:\G(?!\A)\s+|^\[\w+\s+)\K([^\s=]*)\s*=\s*"([^"]*)"~'

请参阅正则表达式演示

细节

  • (?:\G(?!\A)\s+|^\[\w+\s+)
  • \K- 匹配重置运算符
  • ([^\s=]*)- 第 1 组(属性名称):0+ 字符而不是空格和=
  • \s*=\s*-=用 0+ 个空格括起来
  • "- 双引号
  • ([^"]*)- 第 2 组(引号内的属性值):除此之外的任何 0+ 个字符"
  • "- 双引号

获得匹配数组后,您必须“手动”构建关联数组,例如

$s = '[CONST att1="value1" att2="value2"]';
preg_match_all('/(?:\G(?!\A)\s+|^\[\w+\s+)\K(\w+)\s*=\s*"([^"]*)"/', $s, $array_data, PREG_SET_ORDER, 0);
$res = [];
foreach ($array_data as $kvp) {
    $res[$kvp[1]] =  $kvp[2];
}
print_r($res);
// -> Array ( [att1] => value1 [att2] => value2 )

请参阅PHP 演示

另一种处理匹配的方法(演示):

if (preg_match_all('/(?:\G(?!\A)\s+|^\[\w+\s+)\K(\w+)\s*=\s*"([^"]*)"/', $s, $array_data)) {
    array_shift($array_data);
    print_r(array_combine($array_data[0], $array_data[1]));
}

推荐阅读