Как удалить код php из строки?

У меня есть строка, которая имеет код php в нем, я должен удалить код php из строки, например:

<?php $db1 = new ps_DB() ?><p>Dummy</p>

Должен возвратиться <p>Dummy</p>

И строка без php, например, <p>Dummy</p> должен возвратить ту же строку.

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

7
задан Stefan Kendall 15 July 2010 в 18:10
поделиться

3 ответа

 <?php
 function filter_html_tokens($a){
    return is_array($a) && $a[0] == T_INLINE_HTML ?
      $a[1]:
      '';
 }
 $htmlphpstring = '<a>foo</a> something <?php $db1 = new ps_DB() ?><p>Dummy</p>';
 echo implode('',array_map('filter_html_tokens',token_get_all($htmlphpstring)));
 ?>

Как указал ircmaxell: для этого потребуется действующий PHP!

Маршрут регулярного выражения будет (не допуская использования «php» с короткими тегами. Без окончания?> В строке / файле (по какой-то причине Zend рекомендует это?) И, конечно же, паттерн UNgreedy & DOTALL:

preg_replace('/<\\?.*(\\?>|$)/Us', '',$htmlphpstring);
8
ответ дан 7 December 2019 в 01:15
поделиться

Если вы используете PHP, вам просто нужно используйте регулярное выражение для замены всего, что соответствует коду PHP.

Следующий оператор удаляет тег PHP:

preg_replace('/^<\?php.*\?\>/', '', '<?php $db1 = new ps_DB() ?><p>Dummy</p>');

Если он не находит совпадений, он ничего не заменяет.

0
ответ дан 7 December 2019 в 01:15
поделиться

Ну, для этого можно использовать DomDocument...

function stripPHPFromHTML($html) {
    $dom = new DomDocument();
    $dom->loadHtml($html);
    removeProcessingInstructions($dom);
    $simple = simplexml_import_dom($d->getElementsByTagName('body')->item(0));
    return $simple->children()->asXml();
}

function removeProcessingInstructions(DomNode &$node) {
    foreach ($node->childNodes as $child) {
        if ($child instanceof DOMProcessingInstruction) {
            $node->removeChild($child);
        } else {
            removeProcessingInstructions($child);
        }
    }
}

Эти две функции превратятся

$str = '<?php echo "foo"; ?><b>Bar</b>';
$clean = stripPHPFromHTML($str);
$html = '<b>Bar</b>';

Edit: На самом деле, посмотрев на ответ Wrikken, я понял, что оба метода имеют недостаток... Мой требует некоторой валидной HTML разметки (Dom приличный, но он не будет парсить foo). Wrikken's требует корректного PHP (любая синтаксическая ошибка - и он откажет). Так что возможно сочетание этих двух способов (сначала попробуйте один. Если он не работает, попробуйте другой. Если оба не сработают, вы мало что сможете сделать, если не попытаетесь выяснить точную причину их отказа)...

1
ответ дан 7 December 2019 в 01:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: