2013-02-26 3 views
2

Если у меня есть следующий код и хотим вернуть только PHP блок, содержащий «функция хуг», используя регулярное выражение:Использование регулярных выражений для поиска конкретной матч между PHP анкеров

<?php 
    function xyz(
    // Code goes here 
) 
?> 

<!-- HTML code here --> 

<?php 
    // Other code 
    echo "Its done!"; 
?> 

Я пытался сделать следующее регулярное выражение:/(< \ PHP?) * функция хуг * (\>?)/s, чтобы получить следующий результат:..

<?php 
    function xyz(
    // Code goes here 
) 
?> 

Но вместо получения ожидаемого результата, он заканчивает тем, что дает мне все, что между первым «< \? Php» и последним «\?>». Может ли кто-нибудь предложить правильный синтаксис регулярных выражений для этого?

+0

Поскольку теги PHP могут лежать внутри тегов PHP, регулярные выражения не являются подходящим инструментом для задания. Вам нужно будет написать лексер и парсер. Тем не менее, главный вопрос заключается в том, почему вы пытаетесь использовать lex и анализировать файл PHP в первую очередь. – 2013-02-26 20:23:07

+0

Причина, по которой я пытаюсь это сделать, - это то, что мой сайт был взломан, и сотни моих файлов PHP получили к ним вредоносные блоки PHP. Я пытался написать PHP-скрипт, чтобы рекурсивно пройти через все мои PHP-файлы и удалить блокировочные блоки PHP с помощью file_get_contents в строку, а затем использовать preg_replace для удаления злоумышленного блока PHP, а затем file_put_contents, чтобы перезаписать файл PHP. – Scott

+0

Существует полезный [токенизатор PHP] (http://php.net/token_get_all). Я хорошо использовал его при анализе огромной базы кода для существования устаревших/удаленных функций до обновления PHP. – Wiseguy

ответ

2

Джек Maney сделал хороший момент, однако, для вашего конкретного случая вы можете просто использовать

/<\?php.*function xyz.*?\?>/s 

Вы должны использовать ungreedy/lazy, который является ?, который вы вставляете сразу после + или *. Эти два квантора (* и +) являются жадными операторами, а это означает, что он получит самое длинное возможное совпадение, а не кратчайшее, как вы пытаетесь достичь.

+1

Ваше решение работает как шарм - спасибо! – Scott

+1

Если это работает для вас, тогда отметьте ответ как принятый. –

1

Попробуйте следующий:

/(<\?php).*function xyz.*?(\?>)/s 

Единственное отличие состоит в том, что я изменил .* по .*?. Подробнее об этом here (под Берегись алчности!)

Смежные вопросы