1

ReflectionClass::getDocCommentを介して取得したドキュメントブロックからカスタムアノテーションを解析しようとしています。"/(@\w+)\s+([^@]+)/"フラグ付きの正規表現でpreg_match_allを使用すると、PREG_SET_ORDER希望どおりの結果が得られると思いました。インタラクティブシェルでテストしたところ、金色に見えました。

私がテストしようとは思わなかったのは@author、phpdocのタグでした。著者タグのオプションの電子メールアドレス(明らかに)には、が含ま@れています。\b正規表現の文字クラス内で、単語の先頭にあることを要求するために使用することはできません@。これは、単語の境界文字としてではなく、バックスペースとして解釈されるためです。

インスピレーションが必要です!


アップデート:

Arneに感謝します、あなたの答えは私にいくつかのアイデアを与えました、しかし私は目前の特定の問題だけに適応するものより一般的な解決策を好みます。

これまでに2つの可能性を考え出しました。最初のものは、現在ある後続スペースがある場合にのみ機能しますが、常に存在することを保証できるかどうかはわかりません。2つ目は関係なく機能しているように見えますが、はるかに少ないです...問題ありません。

最初の正規表現は"/(@\w+)\s+((?:[^@]\S*?\s+)*)/"

2番目の正規表現は"/(@\w+)\s+((?:[^@]\S*?(?:\s|$)+)*)/"

おそらく誰かが私が2番目のものを片付けるのを手伝ってくれるでしょう。

4

1 に答える 1

2

単語境界としての\bはパターンであり、文字ではないため、単語境界としての\bは文字クラス内では使用できません。

私はあなたが次のようなものと一致したいと思います

@import file @author firstname lastname <mail@address.com>

注釈の名前とパラメータに興味があります。

を含まないように文字ファミリを拡張<し、メールアドレスにオプションのパターンを追加すると、次のようになります。

(@\w+)\s+([^<@]+(?:<[^>]+>)?)

これがあなたの興味のあるすべての注釈と一致するかどうかはわかりませんが、それが出発点かもしれません。

于 2012-07-24T22:44:03.270 に答える