Я пытаюсь сопоставить серию текстовых строк с PCRE на PHP, и у меня возникают проблемы с получением всех совпадений между первым и вторым.
Если кто-то задается вопросом, почему, черт возьми, я бы хотел это сделать, это из-за комментариев доктора. О, как бы мне хотелось, чтобы Zend создавал функции native / plugin для чтения комментариев к документу из файла PHP ...
Для решения проблемы будет использоваться следующий пример (простой) текст. Это всегда будет чистый код 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
Буду признателен за любую помощь, так как я уже чувствую, что этот вопрос смешной, поскольку я его печатаю. Любой, кто пытается ответить на такой вопрос, более смел, чем я!