2012-02-26 7 views
3

ユーザがデータベースに記事を投稿するためのシステムを用意しました。それはHTMLだけなので、改行があるたびに<br />とタイプすることを知りたくないので、入力にPHP関数nl2br()を使用しています。PHPで送信されたテキストの改行の変換

私はまた、記事をフォームに戻す記事変更ツールを提供しています(これは別のページです)。これを行うにあたり、要素は<br />でも見られました(改行はまだあります)。
の要素を修正するには(私が期待していたとにかく)、このサイトの別の質問で見つけたpreg_replace('/<br(\s+)?\/?>/i', "\n", mysql_result($result,$i,"content"))を追加しました。 <br />要素を削除する作業を行いますが、改行で置き換えられているので改行は元々残っていたはずですが、投稿が編集されるたびに段落の間隔がますます広がります毎回。これはユーザーが理解できないものです。一例として、

、私は資料の提出フォームに次のように入力します言う:

Hello, this is my article. 
I am demonstrating a new line here. 

これはに変換されます。そこに改行文字が変換されたにもかかわらず、という

Hello, this is my article.<br /> 
I am demonstrating a new line here. 

お知らせ、まだテキストの改行です。編集フォームでは、<br />は改行に変換され、次のようになります。<br />は改行に変換された

Hello, this is my article. 

I am demonstrating a new line here. 

ので、しかし、改行はすでにありました。だから私はそれが最初にこのようなものに変換するために私は何を期待してることはあると思います:

Hello, this is my article.<br />I am demonstrating a new line here. 

私は思ったんだけど...、元の改行を維持することからnl2br()機能を停止する方法はありますか?それはWindowsの\r\n文字と関係があるでしょうか?

+2

あなたのユーザーがHTMLを信頼でき、絶対に信頼できるものでなければ、おそらく重大な頭痛に冒されているでしょう。ほとんどの人があなたのウェブサイトにHTMLをアップロードできるようにすると、ほとんどフィルタリングされずに、XSSの穴が広がっていて、おそらくはソーシャルエンジニアリングのエントリーポイントがたくさんあるからです。 – tdammers

+2

最初に記事を送信すると、新しい行を
に変換する必要があるのはなぜですか?記事を表示するときに書式を設定できます。 –

+0

@tdammers私が現在フィルタリングしていない唯一の理由は、以下のようにしたいからです: '

'と ' ' 私は、それ以外は何も、HTMLを自分のサイトに提出することは歓迎されないことに非常に同意するので、私は喜んでこれを行うだろう。 私は、記事を提出できる人は招待のみの登録プロセスによって制限されていると言及する必要がありますが、それでも機会を与えてもまだ修正するつもりです。 – muttley91

答えて

2

あなたが使用している機能、nl2brは、それらを挿入し、それらを交換しないために使用されています。\n<br />に置き換える場合は、str_replaceを使用するだけです。同様に:

$string = str_replace("\n","<br />",$string); 

この場合、正規表現は必要ありません。

+0

これは単純な 'nl2br'ですが、彼は他の方法を望んでいます(' br => \ n')。 –

+0

'nl2br()'は実際には "replace"ではなく、すべての改行の前に '
'を追加しているので、改行がまだそこにある理由を説明しています。 – muttley91

+1

さらに、私は通常次のようなものを使用します: '$ string = str_replace(array() "\ r \ n"、 "\ r"、 "\ n")、 "
"、$ string); 'よく使われるすべてのCRLFの組み合わせをカバーします。 – Navarr

1

これはそれを修正する必要があります

preg_replace('/<br(\s+)?\/?>(?!\s*\n)/i', "\n", mysql_result($result,$i,"content")) 

、彼らが同じ行にあるかもしれないので、あなたは、単に、休憩を削除することはできません。この正規表現は、すべての改行を改行で置き換えますが、改行に続く改行では置き換えません。

テキストには<br>\nのままです。追加の正規表現は、それらを取り除くでしょう:それはあなたが記述問題のように思える

preg_replace('/<br(\s+)?\/?>/i', "", $res) 
2

はバグが、bl2brの機能ではありません。

<?php 
function NlToBr($inString) 
{ 
    return preg_replace("%\n%", "<br>", $inString); 
} 
?> 

私はPHPマニュアルのnl2br関数のドキュメントのコメントで、この1が見つかりました::http://php.net/manual/de/function.nl2br.phpのようにあなたは、それのためにあなた自身の関数を書くことができます。私が投稿したものがあなたのためにうまくいかなかった場合は、それがどこから来たのかがもっとたくさんあるはずです。

(それとも、あまりにも、私はそれが動作する必要がありますね、投稿された他の回答から関数を使用する)

関連する問題