Regexp模式匹配(和删除)包含文件的多行PHP代码

时间:2015-10-05 13:47:13

标签: php regex string templates preg-replace

我将模板文件加载到字符串中以便进一步处理(使用file_get_contents)。此模板可能包含我需要在将重新格式化的模板内容发送到stdout之前删除的PHP代码。不应该执行PHP代码,只应将其删除。

示例:

<h1>This is a template. This is HTML code.</h1>
<?php
  // This is a PHP comment.
  uselessFunction ('foo', $bar);
  /* This is another PHP comment */
?>
<p>This is more HTML code followed by </p><?= outputUselessInfo ('Blah blah') ?>
<h1>More HTML</h1>
<? echo "foo " . $bar; ?>
<p>That's all, folks</p>

我需要删除所有PHP代码,请留下:

<h1>This is a template. This is HTML code.</h1>
<p>This is more HTML code followed by 
<h1>More HTML</h1>
<p>That's all, folks</p>

什么样的regexp模式可以匹配所有PHP代码,无论是单行还是多行,长标签还是短标记(例如,通过preg_replace,删除它,不会因此操作而留下空行)?< / p>

我一直盯着它看,但我无法看清楚自己的出路。根据谷歌的说法,我是第一个愚蠢的尝试这个,因为我还没有设法在那里找到任何现成的模式。

(PS:我知道在PHP中使用短标签通常是不鼓励的;我只是想掩盖这种可能性。)

2 个答案:

答案 0 :(得分:2)

尝试使用以下正则表达式(替换为""):

/\n?<\?(php|=)?(.*?)\?>\n?/ms

解释:

\n?       - Tests for a newline
<         - Tests for start tag
\?        - Tests for '?' after the start tag 
(php|=)?  - Tests for the 'php' or '=' after the start tag
(.*?)     - Tests for any PHP code
\?        - Tests for end tag
\n?       - Tests for a newline
/ms        - Allows multiple lines

编辑: Fixed Multiline Support

答案 1 :(得分:0)

或试试这个

/(<[a-z].*?>.*?>)/gm

但它会取出所有的HTML。

O.k。,另一个try

/(<\?.*?\?>)/gms

现在它应该遵循作业。