3

PHPが持つ可能性のある3つのタイプのコメントすべてに一致させる必要があります。

  • # Single line comment

  • // Single line comment

  • /* Multi-line comments */

  •  

     /**
      * And all of its possible variations
      */
    

私が言及しなければならないこと:PHPの終了タグ(?>)がコメント内にあるかどうかを認識できるようにするためにこれを行っています。無視する場合は無視し、そうでない場合は1つとしてカウントします。これは、 Sublime Textによる終了タグの認識を改善するためにXMLドキュメント内で使用されます(これは私を苛立たせているためです!)。私はこれを数時間達成しようとしましたが、できませんでした。XMLで動作するように変換するにはどうすればよいですか?

したがって、if-then-elseログインも含めることができれば、本当にありがたいです。ところで、私は本当にそれが純粋な正規表現表現であり、言語機能などがない必要があります。:)

Eiconが私に思い出させたように、私はそれらすべてが行の先頭またはコードの最後で一致できるようにする必要があるので、それらすべてに次のものも必要です。

<?php
    echo 'something'; # this is a comment
?>
4

2 に答える 2

10

プログラミング言語の解析は、正規表現では実行できないようです。おそらくPHPパーサーを探す必要があります。

しかし、これらはあなたが探している正規表現になります。それらすべてについて、DOTALLまたはSINGLELINEオプションを使用すると仮定します(ただし、最初の2つはそれがなくても機能します)。

~#[^\r\n]*~
~//[^\r\n]*~
~/\*.*?\*/~s

コメント区切り文字が文字列または他の場所に表示され、実際にはコメントが開かない場合、これらのいずれかが問題を引き起こすことに注意してください。

これらすべてを1つの正規表現に結合することもできます。

~(?:#|//)[^\r\n]*|/\*.*?\*/~s

区切り文字を必要としないツールまたは言語(JavaやC#など)を使用する場合は、それらを削除して~ください。この場合、DOTALLオプションを別の方法で適用する必要もあります。しかし、これをどこで使用するかを知らなければ、その方法を説明することはできません。

DOTALLオプションを設定できない/設定したくない場合、これは同等です(例を示すために区切り文字も省略しました)。

(?:#|//)[^\r\n]*|/\*[\s\S]*?\*/

動作するデモについては、こちらをご覧ください。

これで、グループ内のコメントの内容もキャプチャしたい場合は、これを行うことができます

(?|(?:#|//)([^\r\n]*)|/\*([\s\S]*?)\*/)

コメントのタイプに関係なく、コメントの内容(構文区切り文字なし)はキャプチャ1にあります。

別の実用的なデモ

于 2012-10-28T23:34:25.750 に答える
0

1行のコメント

singleLineComment = /'[^']*'|"[^"]*"|((?:#|\/\/).*$)/gm

この正規表現では、によってキャプチャされたすべてのものを置き換える(または削除する)必要があります((?:#|\/\/).*$)。この正規表現は、コメントのように見える文字列の内容を無視します(例$x = "You are the #1";または$y = "You can start comments with // or # in PHP, but I'm a code string";

複数行のコメント

 multilineComment = /^\s*\/\*\*?[^!][.\s\t\S\n\r]*?\*\//gm
于 2016-10-25T14:06:49.277 に答える