2012-01-28 68 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