2013-10-25 47 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 
相关问题