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'代码>。