PHP で一連のテキスト文字列を PCRE と照合しようとしていますが、最初と 2 番目の間にすべての一致を取得するのに問題があります。
なぜ私がこれをやりたいのか疑問に思っている人がいれば、それは Doc Comments のためです。ああ、Zend がネイティブ/プラグイン関数を作成して、PHP ファイルから Doc コメントを読み取ることを望みます...
次の例 (プレーン) テキストが問題に使用されます。これは常に純粋な PHP コードであり、ファイルの先頭に開始タグが 1 つだけあり、終了タグはありません。構文は常に正しいと想定できます。
<?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(){}
問題
クラス内のすべてのメソッドを一致させようとしています。私の正規表現はメソッドをまったく見つけられません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
入力しているときにこの質問はばかげているとすでに感じているので、どんな助けも感謝します。このような質問に答えようとする人は、私よりも勇敢です!