我正在尝试将一系列文本字符串与 PHP 上的 PCRE 进行匹配,并且无法在第一个和第二个之间获取所有匹配项。
如果有人想知道我到底为什么要这样做,那是因为 Doc Comments。哦,我多么希望 Zend 能够制作原生/插件函数来从 PHP 文件中读取 Doc Comments ......
以下示例(纯文本)将用于问题。它始终是纯 PHP 代码,文件开头只有一个开始标记,没有结束标记。您可以假设语法总是正确的。
<?php
class someClass extends someExample
{
function doSomething($someArg = 'someValue')
{
// Nested code blocks...
if($boolTest){}
}
private function killFurbies(){}
protected function runSomething(){}
}
abstract
class anotherClass
{
public function __construct(){}
abstract function saveTheWhales();
}
function globalFunc(){}
问题
试图匹配一个类中的所有方法;我的 RegEx 根本找不到该方法killFurbies()
。让它贪婪意味着它只匹配一个类中的最后一个方法,让它变得懒惰意味着它只匹配第一个方法。
$part = '.*'; // Greedy
$part = '.*?'; // Lazy
$regex = '%class(?:\\n|\\r|\\s)+([a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*)'
. '.*?\{' . $part .'(?:(public|protected|private)(?:\\n|\\r|\\s)+)?'
. 'function(?:\\n|\\r|\\s)+([a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff'
. ']*)(?:\\n|\\r|\\s)*\\(%ms';
preg_match_all($regex, file_get_contents(__EXAMPLE__), $matches, PREG_SET_ORDER);
var_dump($matches);
结果是:
// Lazy:
array(2) {
[0]=>
array(4) {
[0]=>
// Omitted.
[1]=>
string(9) "someClass"
[2]=>
string(0) ""
[3]=>
string(11) "doSomething"
}
[1]=>
array(4) {
[0]=>
// Omitted.
[1]=>
string(12) "anotherClass"
[2]=>
string(6) "public"
[3]=>
string(11) "__construct"
}
}
// Greedy:
array(2) {
[0]=>
array(4) {
[0]=>
// Omitted.
[1]=>
string(9) "someClass"
[2]=>
string(0) ""
[3]=>
string(13) "saveTheWhales"
}
[1]=>
array(4) {
[0]=>
// Omitted.
[1]=>
string(12) "anotherClass"
[2]=>
string(0) ""
[3]=>
string(13) "saveTheWhales"
}
}
我如何匹配所有?:S
任何帮助将不胜感激,因为我在打字时已经觉得这个问题很荒谬。任何试图回答这样的问题的人都比我勇敢!