• 締切済み

<br />について

AAAA <br /> <br />  ・  ・←100行ほど「<br />のループ」   ・ <br /> BBBBBB <br /> <br />  ・  ・ というような悪意的な書き込みがあったとします。 (たまに掲示板などで見かける幼稚な荒らし) こういう書き込みは見た目に不快なので、 PHPでの書き込み処理の段階で<br />を消したり、<br />の数を書き換えるのが正しいやり方と思うのですが、条件を考えても、正規表現を考えても、これといった上手い対処が思い浮かばずに困っています。 CSSで br{ line-height:0; } とすれば解決なんでは?と思い、試してみました。 IE6、IE7、Firefox、Operaで確認したところ <br />がいくつ繰り返されようと改行一回と同じように表示ました。 しかし、 Safari、Chromeでは改行の数だけ高さがついてしまいます。 これについてなにか具体的な解決案がありましたらお知恵を貸してください。 見た目だけでもCSSで解決できればと思っています。 XHTMLの文法としては、なんの解決にもなっていませんが・・。

みんなの回答

  • think49
  • ベストアンサー率59% (285/482)
回答No.3

別解ですが、JavaScriptで対応する方法もあります。 <head> <script type='text/javascript'> function init(){ var br = document.getElementsByTagName('br'); while(br[0].nextSibling.tagName == 'BR'){ br[0].parentNode.removeChild(br[0]); } } if(typeof window.addEventListener == 'function'){ window.addEventListener('load', init, false); } else if(typeof window.attachEvent == 'object'){ window.attachEvent('onload', init); } </script> </head> <body> <p>test<br /><br /><br /><br /><br /><br /><br /><br /><br /><br />test</p> </body> ところで、#1の方の提示されたCSSですが、上記HTMLに <style type='text/css'> /* モダンブラウザ用 */ br+br { display:none; } /* IE6用 */ br { line-height: 0px; } </style> を追加してGoogle Chromeでも改行1つに置換されることを確認しました。 Safariではダメだったということでしょうか? # 個人的な見解ですが、空行には段落を分ける意味があると思うので空行1つに置換させる方が見やすい、と思います。

Sylar
質問者

お礼

JavaScriptのアイディアありがとうございます! <p>test<br /><br /><br /><br /><br /><br /><br /><br /><br /><br />test</p> の場合なら上手くいきますね。 br+br { display:none; }がダメというのは、 A<br /><br />・・<br />B<br /><br />・・<br />C<br /><br />・・<br />D<br />E などと書き込みがあった場合に、 最初の<br />以外(B以降の<br />)は非表示になり 1 2 3 4 5 という具合になってしまうということです。 CSSでの解決はやっぱり無理なんですかね・・。 ># 個人的な見解ですが、空行には段落を分ける意味があると・・・ そうですね。いっそ内容を"<br />"でexplodeし、配列を<p>内とかに入れて、「空白なら表示しない。」などと 置換したほうがよさそうですね。

すると、全ての回答が全文表示されます。
  • atsak
  • ベストアンサー率0% (0/1)
回答No.2

htmlspecianchars()関数はでは望み通りに結果になりませんか? (見た目が不快との事なので違うかもしれませんが) 実際に改行されてしまうのが問題の場合、 htmlspecialchars()関数でHTMLタグはそのまま表示されるようになります ただ普通書き込みのの改行文字もnl2br()関数などで機能させられますが、それも意味ないですよね・・・。 ともあれ、HTMLタグを取り除くならstrip_tags()関数等もありますので試してみてください (論点が違ったらごめんなさい)

参考URL:
http://jp.php.net/htmlspecialchars,http://jp.php.net/nl2br
Sylar
質問者

お礼

回答ありがとうございます。 PHPの処理はいろいろパターンを予想して処理を考えて・・ <br />の処理くらいCSSでできたら楽なのにな・・ と思って質問してみました。 なので論点はあってないようなものです。 ちなみに・・nl2br()って関数は知らなかった・・。

すると、全ての回答が全文表示されます。
回答No.1

br{line-height:0;} br+br{display:none;} IE6はbr+br{}という書き方に対応していないので、併用が良いと思います。 (個人的にIE6対策としてline-height:0というのは勉強になった。。。m(_ _)m) > PHPでの書き込み処理の段階で<br />を消したり、<br />の数を書き換えるのが正しいやり方と思うのですが、 こんな感じでどうでしょうか。 $message=preg_replace(array("/(\\r\\n)+/", "/(\\r)+/", "/(\\n)+/"), "<br />", $message);

Sylar
質問者

お礼

なるほど。br+brか! 良くリストなんかで使うアレですね。 でも、試してみたところ・・ダメっぽいです。 PHPの条件の提案のほう、ありがとうございます。 これなら上手くできますね。正規表現は奥深い・・。

すると、全ての回答が全文表示されます。

関連するQ&A