Помогите с регулярным выражением (PHP, preg_replace) - PullRequest
1 голос
/ 05 августа 2010

Мне нужно сделать preg_replace для всех тегов PHP в строке, а также для любых символов, находящихся между тегами PHP.

Например, если содержимое файла было:

Hey there!
<?php some_stuff() ?>
Woohoo!

Осталось только:

Hey there!
Woohoo!

Вот мой код:

$file_contents = file_get_contents('somefilename.php');
$regex = '#([<?php](.*)[\?>])#e';
$file_contents = preg_replace($regex, '<<GENERATED CONTENT>>', $file_contents);

СБОЙ.

Мои навыки регулярного выражения плохие, может кто-нибудь, пожалуйста, исправьте мое регулярное выражение. Спасибо.

Ответы [ 4 ]

2 голосов
/ 05 августа 2010

Попробуйте это регулярное выражение:

#<\?.*?\?>#

Также должно работать с короткими тегами (без 'php').

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

1 голос
/ 05 августа 2010
$regex="/<?php (.*?)?\>/"

Вы также можете попробовать это, это будет работать для вас

0 голосов
/ 05 августа 2010

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

source.php

<p>Some  HTML</p>
<?php echo("hello world"); ?>
<p>More HTML</p>
<?php
/*
 Strip this out please
 */
?>
<p>Ok Then</p>

tokenize.php

<?php
$source = file_get_contents('source.php');
$tokens= token_get_all($source);
foreach ($tokens as $token) {
 if ($token[2] == 3 || $token[2] == 1 || $token[2] == 9) {
    echo($token[1]);
 }
}

Выход:

<p>Some  HTML</p>
<p>More HTML</p>
<p>Ok Then</p>

Это простой пример. В документации перечислены все токены парсера , которые вы можете проверить.

0 голосов
/ 05 августа 2010

Вы можете попробовать:

$regex = '#<\?php.*?\?>#i';

Используемое регулярное выражение: <\?php.*?\?>

  • <: литерал <
  • \?: ? - это метачар, совпадающий с литералом ?, вам нужно экранировать его.
  • .*?: не жадный, чтобы соответствовать чему-либо.
...