preg_match 括号中字符串之后的第一个字符串

preg_match first string after string in parentheses

我四处寻找接近于此的解决方案,但未能成功找到解决方案。我希望通过 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 codesniffer 项目分享我的解决方案,这样可以加分展示如何为 squizlabs 编写新的修复程序。

试试这个解决方案:

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

替换为:


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

您可以使用

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

this demo

详情

  • array - 文字子串
  • (\(((?:[^()]++|(?1))*)\)) - 第 1 组:
    • \(
    • ((?:[^()]++|(?1))*) - 第 2 组(所需值):
      • (?:[^()]++|(?1))* - 除 () 之外的 1+ 个字符的零次或多次重复或递归的整个第 1 组模式
    • \) - 一个 ) 字符