Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP、正则表达式和新行_Php_Regex - Fatal编程技术网

PHP、正则表达式和新行

PHP、正则表达式和新行,php,regex,Php,Regex,可能重复: 我有一个包含函数列表的文件,其格式如下: function foo(){ ...code { code{} } code... } 对于这个特定的文件,我将始终将单词“function”放在最左边,将结尾的大括号放在最左边。按照惯例,函数中的代码将始终缩进。函数中的代码可以包含任何字符,包括大括号 我想用PHP解析这个文件,得到一个函数的关联数组,其中函数的名称是键。我刚从这里开始,这里是一个非常简单的开始: $regex = "/function.*/"; pre

可能重复:

我有一个包含函数列表的文件,其格式如下:

function foo(){
      ...code { code{}  } code...
}
对于这个特定的文件,我将始终将单词“function”放在最左边,将结尾的大括号放在最左边。按照惯例,函数中的代码将始终缩进。函数中的代码可以包含任何字符,包括大括号

我想用PHP解析这个文件,得到一个函数的关联数组,其中函数的名称是键。我刚从这里开始,这里是一个非常简单的开始:

$regex = "/function.*/";
preg_match_all($regex, $str, $result, PREG_PATTERN_ORDER);
$arr = $result[0];

print_r($arr);
这将生成以下内容并在每一新行停止:

Array
(
    [0] => function foo(){
    [1] => function bar(){
    [2] => function stop(){
    [3] => function go(){
)
我尝试将正则表达式更改为:

$regex = "/function.*\n}$/s";
我的想法是,如果有一个新行字符直接跟在一个大括号后面,
\n}$
将匹配函数的结尾。但是,这不起作用,它会生成一个包含
function foo()


我还没有开始将函数名放入关联数组的键中。

在您的情况下,这样的表达式就足够了:

/^function\s++(\w++).*?^}/ms
它在第一个未缩进的
}
处停止匹配。函数名将在第一个捕获组中,而整个匹配项就是函数。

@John R

这是正则表达式解决方案:

$regex = '~
  function                 #function keyword
  \s+                      #any number of whitespaces 
  (?P<function_name>.*?)   #function name itself
  \s*                      #optional white spaces
  (?P<parameters>\(.*?\))  #function parameters
  \s*                      #optional white spaces
  (?P<body>\{.*?\})        #body of a function
~six';

if (preg_match_all($regex, $input, $matches)) {
  print_r($matches);
}
$regex='1!'~
函数#函数关键字
\s+#任意数量的空格
(?P.*)#函数名本身
\s*#可选空格
(?P\(.*)函数参数
\s*#可选空格
(?P\{.*})函数体
~6';
if(preg_match_all($regex,$input,$matches)){
打印(匹配项);
}

我将研究您的解决方案,但更改为$regex=“/^function\b\s+(\w++).*?$}/ms”会得到一个空数组@问:请考虑把你的答案加起来。@ HakRe,不能,因为这不是一个问题。在这个问题中指定了缩进(并启用了这样一个简单的表达式),而这在另一个问题中没有。@JohnR,将
$
替换为
^
,并使用单引号,而不是双引号,或者需要双转义反斜杠。(始终可以打印/回显变量以确保获得正确的值。)
$re='/^function\b\s+(\w++).*?^}/ms'