質問
私はKohanaのライブラリ、テキスト:: auto_p()のコア機能を変更しています>機能ます。
関数は、「ステロイドにnl2br()」としての地位を説明しています。基本的に、それは<br />
、単一の改行を提供していますが、二重の改行が<p>
タグで囲まれます。
私はそれを発見した制限は、それがしますが、<br />
s <pre>
要素であることです。これは私が欲しいものではありませんこれは、二重の新しい行を作成します。私は正規表現で事前要素をピックアップする修正、および大丈夫作品<br />
を取り除きますコールバックを行った。
しかし、主な問題は、私はauto_p()
'dます私のテキストのコードサンプルを持っている、と私は(読みやすさのために)インデントを維持する必要があるということです。残念ながら私のために、機能のストリップは、先頭と行に空白を末尾ます。
ここで先頭のスペースを取り除き、正規表現である。
$str = preg_replace('~^[ \t]+~m', '', $str);
私は最高の正規表現の第一人者ないんだけど、私が言うことかなり確信している「は、少なくとも1つがある先頭のスペースとタブを取得し、空の文字列に置き換えます。」
私はこの行を削除しようとしているが、私は間違いなくそれを望んでいない場所、それが<br />
を追加します - 1の場合には、私はこのような出力を得ていた。
<ul><br />
<li>something</li>
</ul>
どのように私は<pre>
要素の内側に先頭のスペースを削除しないように、この正規表現やコードを変更しますか?
元ヘルパー関数は、ここでを利用可能です。 (ほとんど下までスクロール)。
あなたが正しいかもしれないが - -私は、私はいくつかの「HTMLパーサを使用します」タイプの答えを得ることを知っている既存のコードは単純に正規表現を使用し、私は含める必要はありません簡単な解決策を(好むだろうライブラリなど)。
あなたの時間をありがとうます。
解決
ここで私はそれを行うだろう方法は次のとおりです。
$str = preg_replace(
'~^[ \t]++(?=(?:[^<]++|<(?!/?+pre\b))*+(?:\z|<pre\b))~im',
'', $str);
は、いくつかのライン先頭の空白と一致した後、先読みは<pre>
又は</pre>
タグを先に走査します。先読みの肉は、このビットは次のとおりです。
(?:[^<]++|<(?!/?+pre\b))*+
それは<pre>
または</pre>
タグの始まりではない場合は、これは、左アングルブラケットのまたはを、左アングルブラケットではないもののゼロ個以上と一致します。それは<pre>
(開始)タグ、</pre>
(終了)タグ、または入力の終了を検出したときにその部分のみのマッチングを停止します。それはそれを停止して終了タグの場合、あなたは<PRE>
要素の中にいる知っているので、あなたは、交換を行うにはしたくない。
所有数量('++'
、'*+'
、および'?+'
は)壊滅的なバックトラッキングを防ぐために不可欠ですA>。 (私はそれを助けることができない:そのフレーズはいつも私は<のhref = "http://en.wikipedia.org/wiki/Half-Life_%28video_game%からの共鳴カスケードシナリオのを考えさせます29" のrel = "nofollowをnoreferrer">ハーフライフの。)
この技術はまた、適度に良好に形成されたHTML、すなわち、全て<pre>...</pre>
タグ適切にバランスをとります。あまりにもSGMLのコメント意志の混乱の内側のタグには、アップ、 - 彼らはバランスすることが起こる場合を除きます。あなたが長いと醜いの3倍の倍の正規表現を作る気にしない場合は、あまりにも、コメントに対処することができます。 :)
他のヒント
あなたの問題が議論されている - このリンクをチェックしてください。
http://us3.php.net/manual/en /function.nl2br.php#91828する
この1と同様ます: