1

これが $source の例です

/**
 * These functions can be replaced via plugins. If plugins do not redefine these
 * functions, then these will be used instead.
 */

if ( !function_exists('wp_set_current_user') ) :
/**
 * Changes the current user by ID or name.
 *
 */
function wp_set_current_user($id, $name = '') {

注意: function_exists 行がないものもあります。

私の特別な目的のために、docblock を正規表現で解析しようとしています。

ここに正規表現があります

$t = preg_match_all("@(/\*\*.*?\*/\nfunction\s.*?\(.*?\))\s{@mis",$source,$m);

私は得ることを期待しています:

    /**
     * Changes the current user by ID or name.
     *
     */
    function wp_set_current_user($id, $name = '') {

代わりに、コード例全体が返されます。

どんな助けでも大歓迎です。


何人かが私の目的を尋ねてきましたが、これはここでは重要ではないと思います。

私は geany を使用していますが、既存のワードプレス コード ヒントが完全ではないことがわかりました。

そして、私が見つけたdocblockパーサーは、関数名と関数引数を解析しません。

だから私は自分でそれらを解析しようとします。

geany のコードヒント形式は

wp_set_current_user|Changes the current user by ID or name.|($id, $name = '')|

ただし、この質問の私のポイントは、正規表現に2番目の「/ **」を開始点として使用させる方法ですか? あなたを混乱させた私の下手な英語で申し訳ありません。

4

2 に答える 2

1

次のように正規表現でコメントアウトを解析できます (チュートリアルの Regex ルックアラウンドをチェックしてください):

/\*\*/(?:(?:.(?!\*\*/))*)\*\*/

次に、任意の数の空白が発生する可能性があります。

[\s]*

PHPで関数に使用できるキーワードは何ですか? 、、、、、何か忘れていstaticたら訂正しvirtualてください。finalpublicprivateprotected

(?:(?:static|virtual|final|public|private|protected)\s+)*

さて、関数ヘッダーとブレース:

function\s+(?P<name>\w\d_+)\s*\(...\)

複雑なphp文字列( )に...なる可能性のあるデフォルト値を含めることができるため、パーツは複雑になります。したがって、値(文字列、文字列、数値、定数)を解析します。$remove_characters = '\'"\n\r '

"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"
\'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*'
[\d.]+
\w+

1 つの大きなvalue正規表現になります。

("[^"\\\\]*(?:\\\\.[^"\\\\]*)*"|\'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*'|[\d.]+|\w+)

そして、すべての関数引数には形式$varor $var = data(もちろん、任意の数のスペース + 私は省略していますarray $input = array()) があるため、これは簡略化された var 名の一致です。

\\$[\w_][\w\d_]*

タイプマッチング:

([\w_]+\s+)?

したがって、関数の引数は次のようになります。

\s*([\w_]+\s+)?(\\$[\w_][\w\d_]*|\\$[\w_][\w\d_]*\s*=\s*<value>)

関数の完全な正規表現は次のようになります。

function\s+(?P<name>\w\d_+)\s*\(\s*|<argument>((,<argument>)*)\)

これらの正規表現をテストするつもりはありません。この時点でそれを行うのはあなたの仕事です。私の目標は、これを本当に正しく実行したい場合に必要なものを示すことでした(ただし、間違いです。本当に単純化されたバージョンを使用することもできます (関数の引数に 1 つの正規表現だけを使用するなど)。

于 2012-11-17T08:44:50.813 に答える
0

簡単な汚いトリックが必要な場合は、先読みアサーションを使用してください

(?<=if\ (\ !function_exists('wp_set_current_user')\ )\ :)

これを検索に追加すると、うまくいくはずです。(一重引用符をエスケープする必要がある場合があります。)

于 2012-11-17T08:50:53.497 に答える