preg_match括号中的第一个字符串

时间:2019-02-17 01:41:45

标签: php regex preg-match phpcodesniffer

我一直在寻找接近解决方案的解决方案,但未能成功找到解决方案。我希望通过php_codesniffer清理一些旧代码,但修复程序无法修复超过80列的注释或数组,只会让您知道它们。我有一个适用于注释的解决方案,但是我被卡在数组的正则表达式上。 我要修复的示例行是:

$line = "drupal_add_js(array('my_common' => array('my_code_validate' => variable_get('my_code_validate', FALSE), 'inner_index2 => 'inner_value2'), 'another_item' => 'another_value'), 'setting');";
$solution = preg_match('/array.*(\(.*?\))/', $line);
echo $solution;

我想要

$solution  = "'my_common' => array('my_code_validate' => variable_get('my_code_validate', FALSE), 'inner_index2 => 'inner_value2'), 'another_item' => 'another_value'";

但是我得到1。请注意,其中还有另一个很常见的数组。我只想捕获第一个数组的值,然后就可以从那里将它们拆分成单独的行。最终,我想将我的解决方案分享给php codeniffer项目,以便为显示如何为squizlabs编写新的修复程序编写代码提供奖励。

2 个答案:

答案 0 :(得分:1)

尝试以下解决方案:

.*?array\(('.*?)\), [^\)]+'\);.*

替换为:

$1

演示:https://regex101.com/r/oV4nvT/4/

答案 1 :(得分:1)

您可以使用

if (preg_match('~array(\(((?:[^()]++|(?1))*)\))~', $s, $matches)) {
  echo $matches[2];
}

请参见this demo

详细信息

  • array-文字子字符串
  • (\(((?:[^()]++|(?1))*)\))-第1组:
    • \(
    • ((?:[^()]++|(?1))*)-第2组(必需值):
      • (?:[^()]++|(?1))*-除()以外的1个以上字符的零个或多个重复或整个第1组模式重复出现
    • \)-一个)字符