2012-01-28 12 views
0

単純なテンプレート/コンテンツパーサーを作成して、最終出力ページにテキストブロックを配置する場所を指定できます。私が整理した "マークアップ"は、それ自身の行に@blockname>のようなものです。したがって、本文にブロックを挿入するには、@ body>でテキストを開始します。ブロック名は、使用したいものであれば何でも構いませんが、スペースや改行を含むことはできません。PHP regex split on @。*?>

@bodyのようなテキスト文字列がテキストに埋め込まれている場合を除いて、すべてうまく動作します。埋め込みテキストも分割されます。これは本当にシンプルなようですが、@で始まり、空白以外の文字で始まり、行末に>で終わる行に一致させたいだけです。私は今、そのほとんど機能していたコマンドがある:

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

私がちょうど^ @(。?[^ \ s]は* [^>])> $を使用することができるはずと思われるが、それは」doesnのまったく働きません。私は何かシンプルなものが欠けていると感じている私は無駄に最後に修飾子の束を試してみました。解析する

例のテキスト:

@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

+0

エスケープシーケンスを定義する方が簡単でしょうか?コンテンツの本文にマークアップタグのようなものが必要な場合は、それをエスケープする必要があることをユーザーに伝えます。結局のところ、HTMLの中で '<'、 '>'などのようなものの目的は、あなたが持っている正確な問題を克服することです... – DaveRandom

答えて

3

私はただの 続い@で始まる行に一致するようにしたいです非空白文字で始まり、行末に>で終わります。

あなたがしていることを行うことができます:PHPで

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

引用。 /mスイッチがありませんでした。^/$には、文字列だけでなく、行頭と行末が一致しています。

+0

それは遭遇する最初のインスタンスでのみ解析されているようです。なぜSの前にダブル\\? –

+0

'\'は二重引用符で囲まれた文字列でエスケープする必要があるためです。そしてそれはうまく動作します。例えば、http://ideone.com/6DOtgのように、私は 'preg_replace' /' preg_replace_callback'を使用します。 – Qtax

+0

最後に、preg_splitがさまざまなシステムで異なるように動作していることが判明しました。私のOSX 10.8/PHP 5.3.6システムでは、あなたの提案はうまくいきます。 Debian Squeeze/PHP 5.3.3のセットアップでは、完全に失敗し、解析は失敗します。 –