PHP ad maç için Regex

1 Cevap php

today my objective is to retrieve all PHP class names associated with
their namespace names but I got stuck. Here is an example of what I have:

$content =<<<END
<?php

namespace test;

class a { }

class b { }

namespace foo;

class bar { }
?>
END;

preg_match_all('~^\s*((?:namespace)\s+(\w+);)?\s*(?:abstract\s+|final\s+)?(?:class|interface)\s+(\w+)~mi', $content, $classes);
var_dump($classes);

Orada ad bir sınıf en fazla olduğu ama ad göre tüm sınıfları maç yapmak için nasıl anlamaya değil sadece ifade çalışır.

1 Cevap

Belki de yerine normal bir ifadenin PHP tokenizer kullanmak daha kolaydır. Basitçe T_NAMESPACE ve T_CLASS arıyor belirteçleri liste üzerinde yürümek.

Örnek (denenmemiş):

$map = array();
$tokens = token_get_all($source_code);
$namespace = 'GLOBAL';
foreach ($tokens as $token) {
    if (!is_string($token)) {
        list($id, $text) = $token;
        if ($id == T_NAMESPACE) {
            $namespace = $text;
        }
        if ($id == T_CLASS) {
            $map[$namespace] = $text;
        }
    }
}
print_r($map);