4

コメント ブロック内で発生する可能性がある特定の文字列を見つけようとしています。その文字列は単語である場合もありますが、単語の一部である場合もあります。たとえば、「codex」という単語を探しているとします。この単語は「bindex」に置き換える必要がありますが、「codexing」のように単語の一部である場合でも同様です。これは「bindexing」に変更する必要があります。

秘訣は、この単語がコメントブロック内にある場合にのみ発生するようにすることです。

/* Lorem ipsum dolor sit amet, codex consectetur adipiscing elit. */

This word --> codex should not be replaced

/* Lorem ipsum dolor sit 
 * amet, codex consectetur 
 * adipiscing elit. 
 */

/** Lorem ipsum dolor sit 
 * amet, codex consectetur 
 * adipiscing elit. 
 */

// Lorem ipsum dolor sit amet, codex consectetur adipiscing elit.

# Lorem ipsum dolor sit amet, codex consectetur adipiscing elit.

------------------- Below "codex" is part of a word -------------------

/* Lorem ipsum dolor sit amet, somecodex consectetur adipiscing elit. */

/* Lorem ipsum dolor sit 
 * amet, codexing consectetur 
 * adipiscing elit. 
 */

And here also, this word --> codex should not be replaced

/** Lorem ipsum dolor sit 
 * amet, testcodexing consectetur 
 * adipiscing elit. 
 */

// Lorem ipsum dolor sit amet, __codex consectetur adipiscing elit.

# Lorem ipsum dolor sit amet, codex__ consectetur adipiscing elit.

これまでのところ、このコードは次のとおりです。

$text = preg_replace ( '~(\/\/|#|\/\*).*?(codex).*?~', '$1 bindex', $text);

この例でわかるように、これは実際には私が望むようには機能していません。複数行のコメントブロック内にある場合、単語を置き換えません。また/* */、「codex」という単語の前にあるすべてのテキストも削除する場合があります。

要件を満たすように正規表現を改善するにはどうすればよいですか?

4

5 に答える 5

2
$text = preg_replace ( '~(//|#|/\*)(.*?)(codex).*?~s', '$1$2bindex', $text );

これは、anubhavaからの回答のように、「コーデックス」の前のコメントを削除しません

于 2013-08-05T20:22:35.413 に答える
0

サブグループを使用したこのようなものは機能するはずです。

$str = preg_replace(
    '~(<!--[a-zA-Z0-9 \n]*)(MYWORD)([a-zA-Z0-9 \n]*-->)~s',
    '$1$3',
     $input
);

コメントの種類ごとに個別のルールを作成し、コメント内で使用できる文字を文字クラスで制限するだけです (否定文字クラスを使用することをお勧めします)。

于 2013-08-05T19:57:14.313 に答える