将PHP类与正则表达式匹配

rqcrx0a6  于 2023-01-01  发布在  PHP
关注(0)|答案(6)|浏览(185)

我想从一个文件中捕获PHP类:

class a {
   function test() { }
}

class b extends a {
   function test() { }
}

并且结果匹配必须是

class a {
   function test() { }
}

以及

class b extends a {
   function test() { }
}
yshpjwxd

yshpjwxd2#

一个正则表达式是做不到这一点的。PHP是一种比正则表达式更复杂的语言(在这里插入一些上下文无关和正则语法)。它会让你发疯,甚至尝试,除非你改变你的源代码,使它更容易匹配正则表达式。

l0oc07j2

l0oc07j24#

使用token_get_all获取PHP代码的language tokens数组,然后对其进行迭代并查找值为 T_CLASS 的标记,该标记表示class关键字(这没有考虑抽象类或可见性)。下一个 T_STRING 标记是类的名称。然后查找下一个值为{的普通标记,增加一个块深度的计数器,然后用每个普通的}标记减少它,直到访问了与左大括号相同数量的右大括号(计数器为0)。

f0brbegy

f0brbegy5#

下一个正则表达式现在起作用了:

^(?:(public|protected|private|abstract)\s+)?class\s+([a-z0-9_]+)(?:\s+extends\s+([a-z0-9_]+))?(?:\s+implements\s+([a-z0-9_]+))?.+?{.+?^}

需求:

case insensitive | ^$ match at line breaks | dot matches new lines

这仅在"class"和最后一个"}"没有缩进时有效。

7z5jn7bk

7z5jn7bk6#

这里的官方方式:

^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$

https://www.php.net/manual/en/language.oop5.basic.php开始
因此,它将是:

class[\s]{1,}[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*

相关问题