2013-04-04 3 views
3

Я пытаюсь извлечь PHP-код из длинного файла. Я хочу выбросить код не в тегах PHP. ПримерРазделить строку самими разделителями php

<html>hello world, its a wonderful day</html> 
<?php echo $user_name; ?> Some more text or HTML <?php echo $datetime; ?> 
I just echoed the user_name and datetime variables. 

Я хочу, чтобы вернуть массив с:

array(
    [1] => "<?php echo $user_name; ?>" 
    [2] => "<?php echo $datetime; ?>" 
) 

Я думаю, что я могу сделать это с помощью регулярных выражений, но им не эксперт. Любая помощь? Я пишу это на PHP. :)

+0

большое место, чтобы начать обучение о Regex [www.regular-expressions.info] (http://www.regular-expressions.info/). – jmbertucci

ответ

7

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

$string = '<html>hello world, its a wonderful day</html> 
<?php echo $user_name; ?> Some more text or HTML <?php echo $datetime; ?> 
I just echoed the user_name and datetime variables.'; 

preg_match_all("/<\?php(.*?)\?>/",$string,$matches); 

print_r($matches[0]); // for php tags 
print_r($matches[1]); // for no php tags 

Update: Как упомянуто Revent, вы могли бы <?= для сокращенных эхо-записей. Можно было бы изменить preg_match_all включить это:

$string = '<html>hello world, its a wonderful day</html> 
<?php echo $user_name; ?> Some more text or HTML <?= $datetime; ?> 
I just echoed the user_name and datetime variables.'; 

preg_match_all("/<\?(php|=)(.*?)\?>/",$string,$matches); 

print_r($matches[0]); // for php tags 
print_r($matches[1]); // for no php tags 

Другой альтернативой является проверка <? (космоса) для сокращенного заявления PHP. Вы можете включать в себя пространство (\s), чтобы проверить это:

preg_match_all("/<\?+(php|=|\s)(.*?)\?>/",$string,$matches); 

Я предполагаю, что это зависит только от того, как «строгий», вы хотите быть.

Update2:MikeM действительно делает хороший момент, о том, чтобы быть в курсе разрывов строк. Вы можете столкнуться в случае, когда ваши метки запуска в следующую строку:

<?php 
echo $user_name; 
?> 

Это легко может быть решена с помощью s модификатора к skip linbreaks:

preg_match_all("/<\?+(php|=|\s)(.*?)\?>/s",$string,$matches); 
+2

PHP иногда может использовать короткие теги, также как Revent

+0

Спасибо! Я пытаюсь это сделать сейчас ... – user1955162

+1

Возможно, вы захотите добавить флаг singleline, поэтому '.' соответствует переменам, т. Е.'/S'. – MikeM

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