首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将mikrotik脚本拆分为key/value php数组

将mikrotik脚本拆分为key/value php数组
EN

Stack Overflow用户
提问于 2020-10-04 18:03:34
回答 2查看 603关注 0票数 2

假设我在mikrotik路由器下面有这个脚本,我想提取一个带有键和值的数组,如果有另一个值包含一个=字符,

代码语言:javascript
复制
add name=100YER on-login=":do {:put \"a\";} on-error={};" rate-limit=256k/512k

结果应该是这样:

代码语言:javascript
复制
$result=array ('name'=>'100YER', on-login=>':do {:put \"a\";} on-error={};', 'rate-limit'=>'256k/512k');

我使用这个regex将其拆分为=,但问题在于登录时的值。

代码语言:javascript
复制
if (preg_match_all('/[^=]+/i', $response, $MATCHES) ){
        //
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-04 18:24:12

您可以使用两个包含分支重置组的捕获组:

代码语言:javascript
复制
(\w+(?:-\w+)*)=(?|"((?:[^"]+|(?<=\\)")++)"|([^"\s]+))

解释

  • ( Capture group 1
    • \w+(?:-\w+)*可选地匹配1+单词字符,然后是-和1+单词字符

  • )闭组1
  • =匹配
  • (?|分支复位组
    • "(匹配"并启动组2
      • (?:[^"]+|(?<=\\)")++匹配除"\"以外的任何字符

代码语言:javascript
复制
- `)"` Close group 2 and match `"`
- `|` Or
- `([^"\s]+)` Capture **group 3**, match any char except `"` or a whitespace char
  • )闭分支复位组

Regex演示 x- Php演示

例如

代码语言:javascript
复制
$re = '/(\w+(?:-\w+)*)=(?|"((?:[^"]+|(?<=\\\\)")++)"|([^"\s]+))/';
$str = 'add name=100YER on-login=":do {:put \\"a\\";} on-error={};" rate-limit=256k/512k';

preg_match_all($re, $str, $matches);
$result = array_combine($matches[1], $matches[2]);
print_r($result);

输出

代码语言:javascript
复制
Array
(
    [name] => 100YER
    [on-login] => :do {:put \"a\";} on-error={};
    [rate-limit] => 256k/512k
)
票数 1
EN

Stack Overflow用户

发布于 2020-10-04 20:53:35

要改进@Thefourthbird的模式,请使用PHP:忽略引号中转义引号的Regex“最佳”技术中的智慧。这不仅提高了模式效率的步骤计数,它还更准确地区分反斜杠是字面上使用的和用于转义的。

否则,我完全同意分支重置最适合于将目标子字符串保持在preg_match_all()输出数组的一致列中。

代码:(演示)

代码语言:javascript
复制
$string = <<<MIKROTIK
add name=100YER on-login=":do {:put \"a\";} on-error={};" rate-limit=256k/512k
MIKROTIK;

var_export(
    preg_match_all(
        '~(\w+(?:-\w+)*)=(?|"([^"\\\\]*(?:\\\\.[^"\\\\]*)*)"|([^" ]+))~',
        $string,
        $out
    )
    ? array_combine($out[1], $out[2])
    : []
);

输出:

代码语言:javascript
复制
array (
  'name' => '100YER',
  'on-login' => ':do {:put \\"a\\";} on-error={};',
  'rate-limit' => '256k/512k',
)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64198123

复制
相关文章

相似问题

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