2010-08-05 99 views
1

我需要对字符串中的所有PHP标记以及位于PHP标记之间的任何字符执行preg_replace。正则表达式帮助(PHP,preg_replace)

例如,如果文件内容是:

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); 

FAIL。

我的正则表达能力很差,有人可以修复我的正则表达式。谢谢。

回答

2

试试这个正则表达式:

#<\?.*?\?># 

应该在短标签工作(没有 'PHP')了。

我认为你的尝试的主要问题是,你需要用反斜杠来转义问号,并且你使用的方括号不应该在那里。方括号表示“选取这些字符中的任何一个”。

+0

谢谢,thomasrutter,已经工作。 – Callum 2010-08-05 05:54:47

0

你可以试试:

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

使用正则表达式:<\?php.*?\?>

  • <:文字<
  • \??是元字符匹配一个 文字?你需要逃脱它。
  • .*?:非贪婪地匹配任何东西。
+0

这也将工作,并且是一个很好的解释。这需要<?php不只是<?就像在我的回答中那样,选择你需要的任何一个。 – thomasrutter 2010-08-05 05:57:41

1
$regex="/<?php (.*?)?\>/" 

你也可以试试这个这会为你

+0

您需要用反斜杠转义第一个和最后一个问号。 – thomasrutter 2010-08-05 05:57:11

0

利用工作为工作的工具。该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> 

这是一个简单的例子。该文档列出您可以检查的所有parser tokens