簡體   English   中英

PHP正則表達式只刪除內聯注釋

[英]php regex remove inline comment only

我有簡單的代碼看起來像這樣

function session(){
   return 1; // this default value for session
}

我需要正則表達式或代碼來刪除注釋// this is default value for session ,並且僅刪除此類型的注釋,該注釋以一個或兩個或多個空格開頭,然后是// ,然后是換行符。

所有其他類型的評論和案例將被忽略。

更新 (1)

並且僅刪除此類型的注釋,該注釋以一個或兩個以上的空格開頭,然后是//,然后是換行符

試試這個:

regex101 1

PHP Fiddle 1- 點擊“運行”或F9查看結果

/\s+\/\/[^\n]+/m
  • \\s+ 以一個或兩個以上空格開始
  • \\/\\/ 轉義的//
  • [^\\n]+ 除換行符外的所有內容

更新:為了確保- 有點 -這僅適用於代碼行,我們可以使用lookbehind (2)正則表達式來檢查是否存在分號; 在空格和注釋之前加斜杠// ,因此正則表達式為:

regex101 2

PHP小提琴2

/(?<=;)\s+\/\/[^\n]+/m

其中(?<=;)是基本上告訴引擎向后看 ,並檢查是否有一個的反向預搜索; 然后再匹配。


-------------------------------------------------- ---------------------

(1) preg_replace 工作全球范圍內,無需對 g 標志

(2) javascript不支持lookbehind

一個純正則表達式解決方案如下所示:

$result = preg_replace('#^(.*?)\s+//.*$#m', '\1', $source);

但這仍然是錯誤的,因為您可能會被這樣的事情困住:

$str = "This is a string // that has a comment inside";

一個更可靠的解決方案是使用token_get_all()完全重寫php代碼,以將PHP代碼實際解析為令牌,然后在重新發送代碼時可以有選擇地刪除它們:

foreach(token_get_all($source) as $token)
{
    if(is_array($token))
    {
        if($token[0] != T_COMMENT || substr($token[1] != '//', 0, 3))
            echo $token[1];
    }
    else
        echo $token;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM