1

Kohana ライブラリのコア関数であるtext::auto_p()関数を変更しています。

この関数は、それ自体を「ステロイドの nl2br()」と表現しています。基本的には<br />一重改行ですが、二重改行は<p>タグで囲まれています。

私が見つけた制限は、それが要素<br />内にあるということです。<pre>これにより、二重の新しい行が作成されますが、これは私が望んでいるものではありません。正規表現を使用して pre 要素を取得するように変更し、問題なく<br />動作する を取り除くコールバックを作成しました。

ただし、主な問題は、テキスト内にauto_p()'d を取得するコード サンプルがあり、(読みやすくするために) インデントを保持する必要があることです。私にとって残念なことに、関数は行の先頭と末尾の空白を取り除きます。

先頭のスペースを削除する正規表現は次のとおりです

$str = preg_replace('~^[ \t]+~m', '', $str);

私は最高の正規表現の第一人者ではありませんが、「少なくとも 1 つある先頭のスペースとタブを取得し、それらを空の文字列に置き換える」と言っていると確信しています。

この行を削除しようとしましたが、<br />絶対に不要な場所に追加されます-あるケースでは、このような出力が得られました

<ul><br />
    <li>something</li>
</ul>

<pre>この正規表現またはコードを変更して、要素内の先頭のスペースを削除しないようにするにはどうすればよいですか?

Kohana のオリジナルのヘルパー関数は、こちらから入手できます。(ほぼ一番下までスクロールします)。

「HTMLパーサーを使用する」タイプの回答がいくつか得られることはわかっています-そしてあなたが正しいかもしれませんが-既存のコードは単に正規表現を使用しているため、より単純なソリューションを好むでしょう(ライブラリなどを含める必要がない場合) .

御時間ありがとうございます。

4

1 に答える 1

1

これが私がそれを行う方法です:

$str = preg_replace(
    '~^[ \t]++(?=(?:[^<]++|<(?!/?+pre\b))*+(?:\z|<pre\b))~im',
    '', $str);

行頭の空白に一致した後、先読みは<pre>or</pre>タグをスキャンします。先読みの要点は次のとおりです。

(?:[^<]++|<(?!/?+pre\b))*+

左山かっこではないもの、または<pre>or</pre>タグの先頭でない場合は左山かっこではないものの 0 個以上に一致します。<pre>その部分は、 (開始) タグ、</pre>(終了) タグ、または入力の終わりに遭遇した場合にのみ一致を停止します。それを止める終了タグの場合は、<PRE>要素の中にいることがわかっているので、置換を行いたくありません。

所有量指定子 (、、'++'および'*+')は、壊滅的なバックトラッキング'?+'を防ぐために不可欠です。(どうしようもない。このフレーズを聞くと、Half-Lifeのレゾナンス カスケードのシナリオをいつも思い出す。)

この手法は、適切に整形された HTML、つまりすべての<pre>...</pre>タグが適切にバランスが取れていることも前提としています。SGML コメント内のタグも、バランスがとれていない限り、めちゃくちゃになります。正規表現を 2 倍長く、3 倍醜くしても構わないのであれば、コメントも処理できます。:)

于 2009-08-09T03:44:51.823 に答える