使用Powershell正则表达式查找PHP字符串,如“<! - ?php eval” - >

时间:2010-06-15 22:14:40

标签: .net regex powershell

我一直在尝试在PHP中找到一个符合以下内容的字符串:

目前我尝试过这样的事情;

  

&lt;()\?php eval(^&gt;&gt;

但它似乎没有正确地获得字符串。

编辑:我忘了添加我需要抓取所有文本格式“”并且它跨越多行。

1 个答案:

答案 0 :(得分:4)

为什么不使用Select-String?

ls *.php | Select-String "<?php eval"

赋予Select-String的模式被读作正则表达式。您可以通过指定simpleMatch开关来执行纯文本匹配:

ls *.php | Select-String "<?php eval" -simpleMatch

以下是获取PowerShell正则表达式实时帮助的命令:

get-help about_regular_expression

编辑:

啊,你没有在你的问题中指明你正在进行REPLACE操作。这有点不同,特别是因为它跨越多行。我会建议这样的事情:

# Retrieve file as a single string.
$contents = [string]::Join("`n", $(Get-Content path\to\file.php))

# Now replace.
$replaced = $contents -replace '(?s)(<\?php eval\()(.*?)(\)\?>)', '$1neweval$3'

所以这样做是寻找<?php eval(,然后寻找)?>的LAZILY(重要!),所有这些都是单行模式,所以新行在.*?部分匹配。 (在问号和斜体之前斜线以逃避它们。)然后它将所有匹配替换为组1(在本例中为<?php eval(),一些文本,然后组3()?>)。您可以根据需要使分组变得复杂,以便从匹配中收集信息。

另外,因为您正在尝试使用正则表达式来解析语言而不是语言解析器,所以很多情况下这可能会非常糟糕,可怕的错误。请注意,在确认输出正确之前,不要破坏文件。