Использование регулярного выражения Powershell для поиска PHP-строк типа "<? Php eval" - PullRequest
2 голосов
/ 16 июня 2010

Я пытался найти в PHP строку, которая выглядит примерно так:

В настоящее время я пробовал что-то вроде этого;

<() \? Php eval (^ >>

но, похоже, строка не получается правильно.

edit: я забыл добавить, что мне нужно захватить всю текстовую форму "", и она занимает несколько строк.

1 Ответ

4 голосов
/ 16 июня 2010

Почему бы просто не использовать Select-String?

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

Шаблон, заданный для Select-String, читается как регулярное выражение. Вы можете выполнить сопоставление в обычном тексте, указав переключатель simpleMatch:

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

Вот команда для получения оперативной справки по регулярным выражениям PowerShell:

get-help about_regular_expression

EDIT:

Ах, вы не указали в своем вопросе, что выполняли операцию ЗАМЕНА. Это немного отличается, особенно потому, что он занимает несколько строк. Я бы предложил что-то вроде этого:

# 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 ()?>). Вы можете сделать группировку настолько сложной, насколько это необходимо для сбора информации внутри матча.

Кроме того, поскольку вы пытаетесь использовать регулярное выражение для синтаксического анализа языка, вместо синтаксического анализатора языка, во многих случаях это может пойти ужасно, ужасно неправильно. Просто будьте внимательны и не забивайте свои файлы, пока не убедитесь, что вывод правильный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...