2012-01-28 69 views
0

我创建了一个简单的模板/内容解析器,您可以指定哪些文本块应放置在最终输出页面中。我自己定义的“标记”就像@blockname>。因此,要在文本框中添加一段文字,您可以使用@body>开始文本。块名可以是任何你想使用的,但不能包含空格或换行符。PHP正则表达式分割在@。*?>

一切工作正常,除非文本中嵌入文本字符串像@body>。它也会在嵌入文本上分割。这看起来非常简单,我只想匹配以@开头的行,后跟任何非空白字符并以行结尾的结尾。我已经把现在几乎工作的命令是:

preg_split('/@([^\s].*?[^>])>/', $tpl, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); 

看来我应该只可以使用^ @(?[^ \ s] * [^>])> $,但没有按”根本不工作。我觉得我错过了一些简单的东西。我已经尝试了一堆修饰符,但最终无济于事。

示例文本解析:

@css> 
.example {font-weight:bold;} 

@js> 
function example() { 
    alert('example'); 
} 

@body> 
This is some sample @body> text to show 

,理想的正则表达式拆分会回来用:

Array 
(
[0] => css 
[1] => 
.example {font-weight:bold;} 
[2] => js 
[3] => 
function example() { 
alert('example'); 
} 
[4] => body 
[5] => 
This is some sample @body> text to show 
+1

'^'只匹配字符串的开头,而不是每行的开头。可以使用修饰符来匹配每一行或预先分割字符串。 – knittl 2012-01-28 15:26:59

+0

定义转义序列不是更容易吗?只要告诉用户,如果他们想在内容正文中看到类似标记标签的内容,那么它必须被转义?毕竟,像HTML中的'<','>'等东西的目的是为了克服你有的确切问题... – DaveRandom 2012-01-28 15:31:01

回答

3

我只是想匹配以@后跟任何 开始的行非空白字符,并以行结尾处的结尾。

你可以做到这一点:

"/^@(\\S+)>$/m" 

随着PHP引用。您可能错过了/m开关,这使得^/$匹配行的开始/结束,而不仅仅是字符串。

+0

这似乎只解析它遇到的第一个实例。为什么在S前面加倍\ \? – 2012-01-28 17:24:58

+0

因为'\'需要用双引号字符串转义。它工作得很好,例如http://ideone.com/6DOtg,所以我会使用'preg_replace' /'preg_replace_callback'。 – Qtax 2012-01-28 20:51:49

+0

终于发现preg_split在不同的系统上工作不同。在我的OSX 10.8/PHP 5.3.6系统上,你的建议工作正常。在我的Debian Squeeze/PHP 5.3.3上,它完全失败,没有解析。 – 2012-02-27 02:52:44