2013-10-25 98 views
0

我想更換一個詞來一些PHP代碼

$filecontent = [regex]::Replace($filecontent, $myword, $phpcode) 

但是$ phpcode也紛紛採用了特殊的變量$ _一些PHP代碼

<?php $cur_author = (isset($_GET['author_name'])) ? get_user_by('slug', $author_name) : get_userdata(intval($author)); ?> 

問題是,當代碼在$ filecontent中替換它將替換$ _變量從php代碼($ _GET)與它在管道中的位置。

這不會發生其他變量,如$ author_name。

我該如何解決這個問題?

回答

3

這是否適合您?

$filecontent = [regex]::Replace($filecontent, $myword, {$phpcode}) 

在一個正則表達式替換操作的$ _是表示整個字符串

http://msdn.microsoft.com/en-us/library/az24scfc.aspx

在大括號結束語使其成爲一個腳本塊代表,繞過正常的正則表達式模式匹配保留的substituion圖案用於替換的算法。

+0

這就是解決方案,簡單的OMG,謝謝 – Pedro3M

3

你有兩種選擇。首先使用一個單引號字符和PowerShell將可以把它看成一個逐字字符串(C#項),即它不會嘗試字符串插值:

'$_ is passed through without interpretation' 

另一種選擇是逃避雙引號的字符串的$字符:

"`$_ is passed through without interpretation" 

當我用正則表達式我將默認使用單引號字符串,除非我有一個需要裏面的字符串進行插補的變量搞亂。

另一種可能性是$_被正則表達式解釋爲替換組,在這種情況下,您需要使用$上的替換轉義。 $$

+0

我不認爲Powershell解釋是這種情況下的問題。這就是$ _是正則表達式中替代模式(整個字符串)的保留字。 – mjolinor

+0

那麼它取決於$ phpcode中的字符串是如何構建的。如果OP使用雙引號字符串,則PowerShell會在*正則表達式查看字符串之前插入*。但從這個問題來看,很難確切地說出發生了什麼。無法看到$ myword的內容。 OP說它用$「管道」替換$ _。 :-( –

+0

他說,其他模式可以解釋爲PowerShell變量不是一個問題,只有$ _。我從這個字符串被單引號推斷。 – mjolinor

1

林不知道我正在關注你,但這有幫助嗎?

$file = path to your file 
$oldword = the word you want to replace 
$newword = the word you want to replace it with 

如果您正在替換的舊字具有特殊字符(即\或$),那麼您必須先將其轉義。您可以通過在特殊字符前加一個反斜槓來避開它們。 Newword,並不需要逃脫。 A $將變成「\ $」。

(get-content $file) | foreach-object {$_ -replace $oldword,$NewWord} | Set-Content $file 
相關問題