0

このクラスは、アノテーションを読み取り、それらを1つの配列に変換する1つの静的メソッドを使用して作成しました。したがって、このコード:

/**
 * @MyAnnotation(attr1=value,attr2=value);
 */
class MyClass
{

    public static function readMyAnnotation()
    {
        $classComment = (new ReflectionClass(get_class()))->getDocComment();
        $comments = explode("\n", $classComment);
        foreach ($comments as $item) {
            if(strpos($item, "@")) {
                $comment = explode("@", $item);
                $annotation = explode(")", $comment[1])[0];
                $annotationName = explode("(", $annotation)[0];
                $annotationValue = explode("(", $annotation)[1];
                $annotationParams = explode(",", $annotationValue);
                $params = [];
                foreach ($annotationParams as $item) {
                    $params[explode("=", $item)[0]] = explode("=", $item)[1];
                }
                print_r([$annotationName => $params]);
            }
        }
    }

}

MyClass::readMyAnnotation();

これを出力します:

Array ( [MyAnnotation] => Array ( [attr1] => value [attr2] => value ) );

誰かが正規表現を使用してこのコードを最適化するのを手伝ってもらえますか?正規表現で良いコードを書くことができません。私のコードはうまく機能しますが、私はそれが好きではありません!

/**
 * @MyAnnotation(attr1=value,attr2=value);
 */
class MyClass
{

    public static function readMyAnnotation()
    {
        $classComment = (new ReflectionClass(get_class()))->getDocComment();
        $comments = explode("\n", $classComment);
        foreach ($comments as $item) {
            if(strpos($item, "@")) {
                /* ?????????????? */
                print_r([$annotationName => $params]);
            }
        }
    }

}
4

1 に答える 1

1

あなたはphp関数を使うことができます、それは括弧内にpreg_match一致した部分文字列を保存します:(.*)$match_name[1]

preg_match("/\@(.*)\(/",$item,$match_name);
$annotationName = $match_name[1];
preg_match("/\((.*)\)/",$item,$match_values);
$values = explode(",",$match_values[1]);
foreach ($values as $value) {
  $exploded = explode("=", $value);
  $params[$exploded[0]] = $exploded[1];
}
于 2012-12-23T20:22:03.130 に答える