我想从一个文件中捕获PHP类:
class a { function test() { } } class b extends a { function test() { } }
并且结果匹配必须是
class a { function test() { } }
以及
class b extends a { function test() { } }
g0czyy6m1#
正则表达式在分析编程语言语法方面很差。考虑使用标记器函数。例如http://php.net/manual/en/function.token-get-all.php请参阅http://framework.zend.com/apidoc/core/Zend_Reflection/Zend_Reflection_File.html
yshpjwxd2#
一个正则表达式是做不到这一点的。PHP是一种比正则表达式更复杂的语言(在这里插入一些上下文无关和正则语法)。它会让你发疯,甚至尝试,除非你改变你的源代码,使它更容易匹配正则表达式。
bakd9h0s3#
以下是您应该使用的方法:http://www.php.net/manual/en/function.token-get-all.php
l0oc07j24#
使用token_get_all获取PHP代码的language tokens数组,然后对其进行迭代并查找值为 T_CLASS 的标记,该标记表示class关键字(这没有考虑抽象类或可见性)。下一个 T_STRING 标记是类的名称。然后查找下一个值为{的普通标记,增加一个块深度的计数器,然后用每个普通的}标记减少它,直到访问了与左大括号相同数量的右大括号(计数器为0)。
token_get_all
class
{
}
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"和最后一个"}"没有缩进时有效。
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]*
6条答案
按热度按时间g0czyy6m1#
正则表达式在分析编程语言语法方面很差。考虑使用标记器函数。例如http://php.net/manual/en/function.token-get-all.php请参阅http://framework.zend.com/apidoc/core/Zend_Reflection/Zend_Reflection_File.html
yshpjwxd2#
一个正则表达式是做不到这一点的。PHP是一种比正则表达式更复杂的语言(在这里插入一些上下文无关和正则语法)。它会让你发疯,甚至尝试,除非你改变你的源代码,使它更容易匹配正则表达式。
bakd9h0s3#
以下是您应该使用的方法:
http://www.php.net/manual/en/function.token-get-all.php
l0oc07j24#
使用
token_get_all
获取PHP代码的language tokens数组,然后对其进行迭代并查找值为 T_CLASS 的标记,该标记表示class
关键字(这没有考虑抽象类或可见性)。下一个 T_STRING 标记是类的名称。然后查找下一个值为{
的普通标记,增加一个块深度的计数器,然后用每个普通的}
标记减少它,直到访问了与左大括号相同数量的右大括号(计数器为0)。f0brbegy5#
下一个正则表达式现在起作用了:
需求:
这仅在"class"和最后一个"}"没有缩进时有效。
7z5jn7bk6#
这里的官方方式:
从https://www.php.net/manual/en/language.oop5.basic.php开始
因此,它将是: