php - 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=]@
。但我无法理解或使其工作。
我需要访问value1
和value2
作为干净的数据。即,没有空格,开始和结束的单引号和双引号。att1
此外,如果and的顺序att2
发生变化,它应该可以工作。
[CONST att2="value2" att1="value1"]
应该输出:
数组(att1=>value1,att2=>value2)
解决方案
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]));
}
推荐阅读
- html - React 获取组件实例的属性
- python - 如何得出结论?
- stm32 - mpu6050&dmp和stm32h7的使用
- apache-kafka-mirrormaker - 使用 MirrorMaker2 重新同步偏移量
- c# - 使用 VMSS 代理进行自动化测试
- google-chrome-extension - 当我开始使用 chrome.tabCapture.capture(
- google-sheets-formula - 我正在尝试将大型(14k)数据从网页收集到我的谷歌表格。IMPORTXML 返回我“超过数据量”的消息。我怎么能通过它?
- android - 尝试从 Godot 导出到 Android 时出错
- android - 在 Android 中访问与 OTG 适配器连接的 USB 驱动器上的文件
- azure-devops - 如何使用 Azure Pipelines 触发驻留在单独存储库中的 terraform 部署?