PHP preg_match_all()来取出所有的php标签

时间:2011-12-07 22:56:10

标签: php regex

我需要一大堆HTML文件来解析<? and ?>标记,记住<?xml以及开放<?php标记不需要的事实结束标记...... EOF也计算在内。

我的正则表达知识无可否认:/<\?[^(\?>)]*\?>/


示例HTML:

<? 
function trans($value) {
  // Make sure it does not translate the function call itself
}
?>
<!-- PHP 

code -->
<div id='test' <?= $extraDiv ?>>
<?= trans("hello"); ?>
<? if ($something == 'hello'): ?>
<? if ($something == 'hello'): ?>
<p>Hello</p>
<? endif; ?>
<?php

// Some multiline PHP stuff
echo trans("You are \"great'"); // I threw some quotes in to toughen the test
echo trans("Will it still work with two");
echo trans('and single quotes');
echo trans("multiline

stuff
");

echo trans("from array('test')",array('test'));

$counter ++;

?>

<p>Smart <?= $this->translation ?> time</p>
<p>Smart <?=$translation ?> time</p>
<p>Smart <?= $_POST['translation'] ?> time</p>

</div>

<?
trans("This php tag has no end");

希望数组:

[0] => "<? 
function trans($value) {
  // Make sure it does not translate the function call itself
}
?>",
[1] => "<?= $extraDiv ?>",
[2] => etc...

2 个答案:

答案 0 :(得分:2)

不,这不是角色类的工作方式。幸运的是,您不必担心这一点,因为我们可以使用?来使字符类非贪婪。我还会在末尾添加s,以便.也可以匹配换行符,但通常不能。{/ p>

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

答案 1 :(得分:0)

看起来你正在寻找的是前瞻和后瞻。这些正则表达式运算符基本上允许您在搜索中包含文本,但在最终结果中省略它。

首先,您要将正则表达式更改为:

'/(?<=\<\?)[^(\?\>)]*(?=\?\>)/'

对于EOF,您使用$符号。因此:

'/(?<=\<\?)[^(\?\>)]*(?=\?\>|$)/'

我没有对此进行测试,但我认为应该做你想要的,或者至少指出你正确的方向。