2014-03-05 29 views
1

我做的,是從字符串去除多餘的空格的一個小功能如何跳過指定的行的preg_replace - PHP

/* remove white space */ 
function wspace($string){ 

    $string = preg_replace('/\s+/', ' ', $string); 
    return $string; 
} 

它的作品不錯,但我有問題是以下; 如果我使用JS字符串此功能至極的目的是,有像

// will brake js output, 

commments例

 $js_string .=" 
     window.addEvent('load', function(){ 
      new Drop({ 
       container:'container', 
       offset: ".$offset.", // top menu offset 
       width:200 
      }); 
     }); 
     "; 

echo wspace($js_string); 

這將輸出

window.addEvent('load', function(){ new Drop({ container:'container',offset: ".$offset.", // top menu offset width:200 }); });"; 

這是註釋掉一切線//

我該怎麼辦o關於跳過或用/*替換那些行或者不會弄亂其餘代碼的東西?

我知道,與/*評論*/更換//什麼是應該做的,但我在我的舊腳本,它被廣泛用於製作更新,我不知道,如果用戶有//或/ *評論*/。所以爲了不破壞別人的代碼,我需要確定之後我釋放這個。

我想這樣做

if($string contains //) skip to next line 

或任何你認爲這是可行的,以使該功能更加安全。

任何幫助表示讚賞。謝謝!

回答

1

你可以試試這個。 preg_replace可以將數組作爲模式並替換。

function wspace($string){ 
    $string = preg_replace(array('/[^:]\/\/.*$/m','/\/\*.*\*\//U', '/\s+/'), array('','',' '), $string); 
    return $string; 
} 

編輯:

如果您也想刪除從腳本/ * ... * /評論,您可以使用此

​​

注:我沒有測試過這些在真正的JavaScript功能。
編輯:使它://url...安全。

+0

我測試,但事情仍然是搞亂起來。啊,發現這個問題,有變量,包含http://sitelink.com,所以我得到var sp ='http:var tp =' – Benn

+0

它實際上適用於所問的問題,所以你是正確的,我將如何去跳過http://? – Benn

+0

好吧,額外的空間有助於發現評論,如空間評論和/ /評論,它留下了與http://單獨 – Benn

2

您可以使用此模式:

$pattern = <<<'EOD' 
~ 
# this first part skips content between quotes 
(["']) (?>[^'"\\]+|\\.|(?!\1)["'])* \1 (*SKIP)(*FAIL) 
| 
# this part matches comments and capture the content in group 2 
//(\N*) 
| 
# this part matches whitespace characters 
\s+ 
~xs 
EOD; 

然後用preg_replace_callback()使用它:

$result = preg_replace_callback($pattern, function ($m) { 
    return ($m[2]) ? '/* ' . trim($m[2]) . ' */' : ' '; 
}, $data); 

print_r($result); 
+0

這是一個很好的正則表達式Casimir(一如既往)。我特別喜歡'(?!\ 1)[''])* \ 1'來模擬字符類否定+1。 –

+0

@AmalMurali:謝謝你的編輯!但是這個模式可以被簡化。那。 –