如何在[LOOP] ... [/ LOOP]之间获取字符串

时间:2009-04-13 00:51:41

标签: php regex

如何在[LOOP] ... [/ LOOP]之间获取字符串 我试试这个但不行吗

$gloop = preg_replace('/\[LOOP\]([^\[]*)\[\/LOOP\]/', '\\1', $var);

... 字符串:

'<tr>
    [LOOP]<th scope="col">%Gdata_All%</th>[/LOOP]
</tr>'

但我会在[LOOP]中串起来...... [/ LOOP]

2 个答案:

答案 0 :(得分:9)

我首先要说的是,您是否正在创建自己的模板库?有一些成熟的,如Smarty,应该能够满足你的要求。杰夫阿特伍德的这篇文章也很好读:“Don't Reinvent The Wheel, Unless You Plan on Learning More About Wheels

如果您想推出自己的解决方案,那么这很好,这里有一些建议。

的BBCode


此方法依赖于使用PHP安装BBCode扩展,它是本机的,不依赖于正则表达式引擎(慢)。这个解决方案可能是最快的。

您可以让BBCode解析器转换

[LOOP]<td><?php print $row->title; ?></td>[/LOOP]

<?php foreach($result as $row): ?><td><?php print $row->title; ?></td><?php endforeach; ?>

查看BBCode参数,了解如何将变量传递到[LOOP]语法中。

您可以在bbcode_create方法页面上查看更多示例。

正则表达式


它们有点慢,但默认情况下在所有PHP安装上都启用。

为这个正则表达而去Gumbo的积分(你应该投票给他)。

/\[LOOP]((?:[^[]+|\[(?=\/LOOP]))*)\[\/LOOP]/

然后您可以按如下方式使用它。

if (preg_match('%\[LOOP\]((?:[^[]+|\[(?=/LOOP\]))*)\[/LOOP\]%i', $subject, $result)) {
    # Successful match
    # You can access the content using $result[1];
} else {
    # Match attempt failed
}

-Mathew

答案 1 :(得分:1)

我会使用这个正则表达式:

/\[LOOP]((?:[^[]+|\[(?=\/LOOP]))*)\[\/LOOP]/

它匹配[[^[]+)或[以外的任何字符序列,后面没有/LOOP] \[(?!\/LOOP]),{ {1}} (?! expr)[LOOP]之间的负面预测断言;周围的[/LOOP] (?: expr是一个非捕获分组。

但如果您使用真正的解析器来检测已经指出的The Pixel Developer格式错误的代码,那肯定会更好。