Я пытаюсь сопоставить ряд текстовых строк с PCRE на PHP, и у меня возникают проблемы с получением всех совпадений между первым и вторым.
Если кто-то задается вопросом, с какой стати мне это делать, так это из-за комментариев доктора. О, как бы я хотел, чтобы Zend сделал нативные/плагинные функции для чтения комментариев Doc из файла 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"
}
}
Как сопоставить все? :С
Будем признательны за любую помощь, так как я уже чувствую, что этот вопрос нелеп, когда я его печатаю. Любой, кто пытается ответить на подобный вопрос, смелее меня!