PHPのnl2br関数を使うと改行が<br />に変換されますが、

<br />ではなく<br>に変換したいです。
PHP5.2.xで改行を<br>に変換する方法は無いでしょうか?

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:2009/09/19 23:46:38
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:yoshifumi1975 No.1

回答回数58ベストアンサー獲得回数10

ポイント35pt

preg_replace関数ではどうでしょうか。

正規表現で、改行文字にマッチさせ、それを、"
" で置き換えます。

以下はサンプルです。

<?php

$s=<<<END_OF_MSG
abc
def
ghi
END_OF_MSG;

echo preg_replace( '/\n|\r|(\r\n)/', "<br>", $s );
?>

http://www.php.net/manual/ja/function.preg-replace.php

id:hellfencer

ありがとうございます。とても参考になりました。

無事に変換する事が出来ました。

2009/09/19 21:48:45

その他の回答2件)

id:yoshifumi1975 No.1

回答回数58ベストアンサー獲得回数10ここでベストアンサー

ポイント35pt

preg_replace関数ではどうでしょうか。

正規表現で、改行文字にマッチさせ、それを、"
" で置き換えます。

以下はサンプルです。

<?php

$s=<<<END_OF_MSG
abc
def
ghi
END_OF_MSG;

echo preg_replace( '/\n|\r|(\r\n)/', "<br>", $s );
?>

http://www.php.net/manual/ja/function.preg-replace.php

id:hellfencer

ありがとうございます。とても参考になりました。

無事に変換する事が出来ました。

2009/09/19 21:48:45
id:kn1967 No.2

回答回数2915ベストアンサー獲得回数301

ポイント25pt

実際に実行した訳でも無いので本来はコメント欄に書くべきかとも思いましたが、

開けておられないので、本回答で失礼します。


【1】組み込み関数をオーバーライドするための事前準備

PHP: runkit - Manual を導入し、php.ini等適宜設定。


【2】オーバーライド

下記、動作テストはしていません。

$kekka = '関数置換失敗';
if(runkit_function_copy('nl2br', 'original_nl2br')) {
  if(runkit_function_remove('nl2br')){
    if(runkit_function_add('nl2br', '$str', "return preg_replace('/ \/>$/', '>', original_nl2br($str))")){
      $kekka = '関数置換成功!';
    }
  }
}
echo $kekka;

runkit を導入できるくらいの権限があるならば、

phpを5.3.xにできないかを検討するほうがよろしいかもしれません。

PHP: nl2br - Manual

id:hellfencer

ありがとうございます。

実際にスクリプトを動かすのがレンタルサーバーなので

導入する権限が無いのですが、こんな方法もあるのですね。

2009/09/19 21:58:26
id:cooper0524 No.3

回答回数296ベストアンサー獲得回数4

ポイント25pt

方法については既に回答者がおられますので割愛します。

回答で出ているロジックを関数にして使いまわせるようにすると

ソースの短縮+綺麗になるかと思います。

function _n2b($s){

return preg_replace( '/\n|\r|(\r\n)/', "
", $s );

}

あと、余談ではありますがHTML4.01上で
を使っても

解釈はしてくれますのでエラー等は出ないかと思います。

(HTMLの評価的には良くないのかもしれませんが…)

Yahoo! JAPAN

URLはダミーです

id:hellfencer

ありがとうございます。

確かにブラウザで見る分には/が入っていても問題無いんですが、

ソースを見るとやっぱり気になってしまいます。

2009/09/19 23:44:39
  • id:chrono1742
    回答2の方の答えは、関数の定義が間違っていますし、オーバーライドは互換性が無くなるので普通は使わないと思うのですが・・・
  • id:kn1967
    > chrono1742 2009-09-20 01:07:32
    > 回答2の方の答えは、関数の定義が間違っていますし、オーバーライドは互換性が無くなるので普通は使わないと思うのですが・・・

    使いませんね。そのため〆の言葉として、
    「runkit を導入できるくらいの権限があるならば、
    phpを5.3.xにできないかを検討するほうがよろしいかもしれません。」
    と書いてあるのですが、
    あなたも文章をよく読まずにkn1967を対象に批判を繰り返す輩ですか・・・。

    回答内容の間違いについては、確かに「コメント欄に書くべきかとも思いましたが」や
    「テストしていません」では、完全なる免罪符にはなりませんね。 
    それを指摘していただけるのはありがたい事ですが、
    具体的にどこをどのように訂正すべきかを示さずに「間違っています」だけでは、
    どちらが本当に間違っているのかが判りません。

    間違いを指摘するという事は十分な知識と準備、さらに実行し続ける労力が必要なため、
    指摘を行う人はキトクな方だと思いますが、労力を惜しむ(具体的に示さない)のであれば、
    安易に人の批判をするのではなく、自分の行動や回答を見直す事をまずはお勧めします。

    http://q.hatena.ne.jp/1252732857/232673/#i232674
    >「はてな」に来て日が浅い
    などと書いていた事もあるようだけど、日が浅い人の使い方ではないですし、
    回答分野や、行動パターン、文章構成までもがある人に似てますねぇ・・・。
    「背中が透けているぜ」って言葉を思い出したよ(笑)
  • id:yoshifumi1975
    横ですが、kn1967さんが紹介したオーバーライドという方法は知らなかったので有益でした。5.3からnl2brが改良されたのも知りませんでしたので、ありがとうございました。
  • id:chrono1742
    kn1967様
    軽い気持ちでコメントを書いたつもりでしたが、ご気分を害してしまったようで申し訳ありません。
    以後、kn1967様の回答が間違っていてもコメントしないようにいたします。
    本当に申し訳ありませんでした。

    yoshifumi1975様
    フォローを入れてくださって、ありがとうございます。
    質問者の方にまでお気をつかわせてしまい、本当に申し訳ありませんでした。
  • id:kn1967
    yoshifumi1975さんは質問者ではなく回答者ですね。

    それはさておき・・・、

    chrono1742 2009-09-20 07:29:26
    >軽い気持ちでコメントを書いたつもりでしたが、ご気分を害してしまったようで申し訳ありません。
    >以後、kn1967様の回答が間違っていてもコメントしないようにいたします。
    http://q.hatena.ne.jp/1253399736

    責めてはいませんし、気分を害したわけでもありません。
    間違いの指摘はしていただいたほうが有難いのです。

    しかしながら、具体的にどこがどのように間違っているかを指摘して頂かないことには、
    「kn1967 が間違っている」のか「間違いだと指摘した本人のほうが間違っている」のかが判らないのです。

    さて、間違いということですが、どこが具体的にまちがっていたのでしょうか?
  • id:chrono1742
    kn1967様
    具体的に間違っている点を指摘せよとの仰せですので、恐れながら疑問に感じたところを列挙します。

    ・runkit_function_addの引数について、return preg_replace('/ \/>$/', '>', original_nl2br($str))")では変換されません。$が終端記号だからです。わざわざオリジナルのnl2brに追加するという形をとらなくても、正規表現の部分については、yoshifumi1975様が回答している'/\n|\r|(\r\n)/'と同じであれば変換できます。
    ・それであれば、わざわざオーバーライドしなくても、yoshifumi1975様が回答している方法で十分です。
    ・さらに、現在リリースされているrunkitはPHP5.2では正常に動きません。パッチを当てれば動くようですが。

    以上、ご検討をよろしくお願いいたします。
  • id:kn1967
    【1】正規表現
    $は確かにゴミですね。訂正に感謝します。

    オリジナルのnl2brに追加するかどうかは、
      runkit_function_copy
      runkit_function_remove
      runkit_function_add
    の動作を説明、理解しやすいだろうという判断でオリジナルを用いたのですが、
    実際に使うのは、おっしゃるとおりどちらでも構いません。


    【2】わざわざオーバーライドしなくても、yoshifumi1975様が回答している方法で十分です。
    (1)変更箇所が少ない場合
      yoshifumi1975 氏の方法で必要十分
    (2)今後も使いまわす可能性がある場合
      cooper0524 氏の方法で補強すれば十分
    (3)既存のコードに極力手を加えたくない場合
      オーバーライド
    (4)その他
      php5.3.xへのバージョンアップ
    yoshifumi1975 氏の方法で十分だと判ったのは回答が開かれて、
    質問者であるhellfencer氏からのコメントやポイント配分がなされたからこその話であり、
    回答投稿時点で「どれが適している」とか「十分だ」といったような判断をすることは出来ない。


    【3】現在リリースされているrunkitはPHP5.2では正常に動きません。パッチを当てれば動くようですが。
    そうでしたか? それはまた未確認で申し訳ないのですが、
    それについても情報が無いと真偽のほどが判りかねますので、
    情報源だけでも提示しておいていただきたいです。


    以上、確実な間違い点を1点訂正いただき、あわせてまた不鮮明な点が1点浮上。
    おかげさまで、ここまでは確認できましたので、不鮮明な点埋めていただければと願います。
  • id:chrono1742
    kn1967様
    runkitのバグレポート(下記)をご覧になれば分かります。runkitパッケージの更新は2006年6月で止まっており、PHP5.2がリリースされたのは2009年ですから、bug-fixが追いついていない状態なのです。
    http://pecl.php.net/bugs/search.php?cmd=display&status=Open&package_name[]=runkit

    また、最新パッケージの README に Sandboxは "ONLY AVAILABLE in PHP 5.1 (release version, or snapshot dated after April 28th, 2005)" と明記されています。

    パッチを当てての話は伝聞ですので、ネット上にソースはありません。ごめんなさい。

    恐れながら、これらの事実は Sandboxでは常識になっていることですし、ご自身が回答されたリンク先からすぐ分かることばかりです。ご検討をよろしくお願いします。
  • id:kn1967
    確かに更新はされてないし、そもそもベータ版のままだったりするけど、
    それが理由にはならないよ。
    http://pecl.php.net/package/runkit

    理由としてサンドボックスをあげてきてるようだけど、
    今件で利用している下記の関数に何か関係するのかな?
      runkit_function_copy
      runkit_function_remove
      runkit_function_add
    まさか、バグフィックスされてない関数があるから他も怪しいとか言わないよね?
    (そんな事まで言い出したら、Windowsなんて使えないよね・・・。)

    $については明らかにおかしいものなので、指摘はもっともだと思うし、
    指摘に感謝しているのだけど、そのほかは後から慌てて調べて付け足したんでしょ?

    回答の間違いや不足分をフォローするには、回答以上にスキルが必要であり、
    また、気を使う必要もある事に、そろそろ気づいて欲しいものなのだが、まだ気づかない?

    この件について、これ以上やるとヤブヘビになると思うが、まだ続ける?
  • id:chrono1742
    kn1967様

    > 理由としてサンドボックスをあげてきてるようだけど、
    > 今件で利用している下記の関数に何か関係するのかな?

    runkitのREADMEとソースをよくお読みになった方がよろしいかと。
    いずれにしても、PHP5.2.xでrunkitのすべての関数が動作するという根拠のURLをお示しください。

    私の環境(Fedora11+PHP5.2.9)ではrunkitをインストールすることすらできません。原因と対処は下記に記されている通りです。
    http://itpro.nikkeibp.co.jp/article/COLUMN/20090115/322874/
  • id:kn1967
    >私の環境(Fedora11+PHP5.2.9)ではrunkitをインストールすることすらできません。
    >原因と対処は下記に記されている通りです。
    >http://itpro.nikkeibp.co.jp/article/COLUMN/20090115/322874/

    そのページに対処方法まで載ってるというのに、それでもインストールできないってのは、
    貴殿のスキルが足りてないだけでしょ。
    貴殿のスキル不足まで埋める手助けをする義理も人情も無いよ。


    >PHP5.2.xでrunkitのすべての関数が動作するという根拠

    「すべての関数」なんて、どこで誰が言ったというのかな?
    繰り返すけど、今件に必要なのは、
      runkit_function_copy
      runkit_function_remove
      runkit_function_add
    の3つ。
    根拠を示せとの事だが、追加・変更機能については、貴殿の示した
    http://itpro.nikkeibp.co.jp/article/COLUMN/20090115/322874/ にも
    「基本的な関数などの追加・変更機能はPHP4と5の全てのバージョンで使用することができ」と
    書いてあるのだが、これまた文章の一部しか読まずに理解できないとか、
    インストールできないと言っているだけですね。


    やればやるほど、ボロがでてくるし、何とか話をそらそうとする行為も、その際の、
    文章構成も、だんだんと kmond2 の時と同じになってきたのに気づいてないのかしら?
  • id:chrono1742
    kn1967様

    http://itpro.nikkeibp.co.jp/article/COLUMN/20090115/322874/
    ここに書いてある通りにソースを変更しないとインストールができません。
    そして、kn1967様は、今まで一度もその情報を与えていません。
    インストールができなければ、回答されたスクリプトは動かないわけですよ。
    そのような回答は、回答として不備がありますよ。
  • id:kn1967
    >ソースを変更しないとインストールができません。
    >そして、kn1967様は、今まで一度もその情報を与えていません。
    >インストールができなければ、回答されたスクリプトは動かない

    >回答として不備

    【1】必然性はない。
    質問者が追加情報を求めてきていたら回答やコメントを行っただろうけど、
    相手のOS環境も判らなければ、スキルも判らない、過去質問も多くないので、
    どのような状態におかれて質問しているのかも判らないという状況で、
    そこまで事細かに書かなければならないという必然性は無い。

    既にインストールされているような場合であれば、
    インストールの心配をする必要すらないわけだし、
    仮にインストールを行おうとした場合でもエラーになったりする訳ですから、
    必然的に追加回答を求められるはずであり、その際に答えれば済むだけの話。

    【2】質問者本人による関連質問や過去質問などから想定はできないか?
    最近のものとしてlivedoorでphpって質問があるじゃないかと突っ込まれそうだが、
    1回限りの質問だし、あちらの質疑応答から察すれば逆に、
    「単語さえ判れば自力で出来そう」とも思えるので、その点でも必然性は感じない。


    >runkitはPHP5.2では正常に動きません。パッチを当てれば動くようですが。

    パッチではなくソースを弄れば動くという事が、自身の書き込んだURL先で明らかになった訳だから、
    話の落としどころだったはずなんだけど、自分で機会をつぶすのね・・・。
    今度はインストールの事まで考えろなんて無茶を言い出して、何を目指したいんだか・・・。
  • id:chrono1742
    hellfencer様

    kn1967様の回答については、ご本人も認めているように、正規表現に不備がありますので想定通りに動作はしません。
    また、runkitをPHP5.2.xにインストールするためにはソース変更が必要なので、そこまで手間をかけて挑戦するほどのものではなく、yoshifumi1975様が回答している方法で十分かと存じます。
    取り急ぎ、いままでの総括をお知らせいたします。お見苦しいやり取りが続き、失礼いたしました。

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません