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の文法としては、なんの解決にもなっていませんが・・。

このQ&Aに関連する最新のQ&A

A 回答 (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つに置換させる方が見やすい、と思います。
    • good
    • 0
この回答へのお礼

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>内とかに入れて、「空白なら表示しない。」などと
置換したほうがよさそうですね。

お礼日時:2009/05/25 22:41

htmlspecianchars()関数はでは望み通りに結果になりませんか?


(見た目が不快との事なので違うかもしれませんが)

実際に改行されてしまうのが問題の場合、
htmlspecialchars()関数でHTMLタグはそのまま表示されるようになります
ただ普通書き込みのの改行文字もnl2br()関数などで機能させられますが、それも意味ないですよね・・・。

ともあれ、HTMLタグを取り除くならstrip_tags()関数等もありますので試してみてください
(論点が違ったらごめんなさい)

参考URL:http://jp.php.net/htmlspecialchars,http://jp.php …
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

PHPの処理はいろいろパターンを予想して処理を考えて・・
<br />の処理くらいCSSでできたら楽なのにな・・
と思って質問してみました。
なので論点はあってないようなものです。

ちなみに・・nl2br()って関数は知らなかった・・。

お礼日時:2009/05/22 21:25

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);
    • good
    • 0
この回答へのお礼

なるほど。br+brか!
良くリストなんかで使うアレですね。
でも、試してみたところ・・ダメっぽいです。

PHPの条件の提案のほう、ありがとうございます。
これなら上手くできますね。正規表現は奥深い・・。

お礼日時:2009/05/22 21:19

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング

おすすめ情報