質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

3回答

2148閲覧

管理画面から吸い上げた文字列をlist形式に変換する

noza

総合スコア7

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2016/06/15 02:37

編集2016/06/15 03:11

管理画面に入力した項目や文言を、PHPを使って吸い上げてサイト上に表示しています。
※私自身はエンジニアではないので、前任の者が書いたコードをなんとか読み取っている状態です。

<h1>四季の種類</h1> <?php echo nl2br(Hq_Common::obj($job, 'free_items.22.memo')); ?>

現状の仕組みだと文字列をそのまま吸い上げているので、

例)

<h1>四季の種類<h1> 春<br> 夏<br> 秋<br> 冬<br>

といった形でHTML上に表示されます。
<br>は管理画面で入力したエンター)

これを、吸い上げてHTMLに表示する際に

<h1>四季の種類</h1> <ul> <li>春</li> <li>夏</li> <li>秋</li> <li>冬</li> </ul> といったように自動的にlist形式に変換したいと思っています。 こちらはどのような仕組みを使えばうまく変換できますでしょうか。

どなたか回答いただけると幸いです。

yambejp さん

ul-li形式にしたいと考えています。
元データは<li>の中に入る文言を入力しているので表題などは無いです。
空白行は案件によってある場合もあります。。
たしかに空白行は、ひとつのグループの終わりを改行で表現しているとも言えます。
最終型は提示いただいたもので問題ありません。
ただし<h1><ul>はあらかじめ書いておいて<li>だけを挿入できれば良いのかな?と思っていました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kei344

2016/06/15 02:39

ご自身で書かれたコードを質問文に追記いただいたほうが回答を得られやすいと思います。
yambejp

2016/06/15 02:50

いくつか確認事項 →dl-dt-ddではなくul-liにしたい? →ul-liだと表題は構造的に明示できないですが大丈夫ですか? (hタグにするとか?) →元データは一行目が表題で、その後行ごとに1データという仕様でよいですね? →空白行とかない前提でいいですか?(もしくは空白行がグループの終わり?) →最終型としてはこんな感じになればよい? <h1>四季の種類</h1> <ul> <li>春</li> <li>夏</li> <li>秋</li> <li>冬</li> </ul>
guest

回答3

0

  1. preg_replace 関数を使う
  2. アプローチを変えて、teratailのように markdown記法で入力できるようにする。

投稿2016/06/15 02:42

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

noza

2016/06/16 09:03

ご回答ありがとうございます。 関数について調べてみて自分なりに試行錯誤してみようと思います。 アドバイスありがとうございました。
guest

0

ざっとやってみました
処理的には見出し(hタグ)につづく文字列+brタグをリスト化
brの後ろに改行が2個以上続いた時点で終了
たぶんバグがありますので参考程度に

<?PHP $contents=<<<eod <h1>四季の種類</h1> 春<br> 夏<br> <br> 秋<br> 冬<br> test<br> eod; $pattern="/(<(h\d)>.*?<\/\\2>(?:\r\n|\r|\n))(((.*?)<br>(?:\r\n|\r|\n|$))+?)(\r\n|\r|\n)/mis"; if(preg_match($pattern,$contents,$matches)){ $contents =$matches[1]; $contents.="<ul>\n"; $pattern="/(.*?)<br>(?:\r\n|\r|\n)(?!\r\n|\r|\n)/s"; $replacement=function($a){return "<li>".$a[1]."</li>\n";}; $contents.=preg_replace_callback($pattern,$replacement,$matches[3]); $contents.="</ul>\n"; } print $contents; ?>

投稿2016/06/15 04:57

yambejp

総合スコア114883

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

noza

2016/06/16 09:03

ご回答ありがとうございます。 試してみたのですが、決められた文言をあらかじめ入力する形ならうまくいったのですが、動的に吸い上げているものをうまく$contents内に格納できずうまくいきませんでした。 関数について調べてみて自分なりに試行錯誤してみようと思います。 アドバイスありがとうございました。
guest

0

こんな感じの捉え方でいいんでしょうか?
<br>が法則性を持って送られてくるなら、それを区切りとして配列に格納してあげ、
その配列をforeachで一つ一つ展開してあげて、タグを結合。最後にechoで呼び出します。

<h1>四季の種類</h1> <ul> <?php $ar = array(); //任意の配列 $text = nl2br(Hq_Common::obj($job, 'free_items.22.memo')); $ar = explode("\<br\>",$text); //<br>タグ区切りで配列に格納 //配列の値ごとにlistタグで括る foreach( $ar as $val){ $list .= "<li>{$val}</li>"; } echo $list; ?> </ul>

投稿2016/06/15 04:31

FKM

総合スコア3640

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

noza

2016/06/15 06:45

ご回答ありがとうございます。 試してみたところ、1行の文言については問題なくlist化できました! ただ、2行以上ある文言については <li>春<br> 夏</li> といった形で表示されてしまいました。 array(); //任意の配列 とありますが、こちらに情報を入力してあげないとうまくいかないのでしょうか。 PHPに関してはほとんど素人のため、お手数おかけしますが補足いただけると幸いです。
FKM

2016/06/15 08:46

どうやら、改行のエスケープ文字が邪魔しているようですね。それなら、 他の方も挙げていらっしゃるように、preg_replace関数で、改行文字を 削除してみてどうでしょうか。 あと、$ar = array() というのは、$arを配列として使いますよという 宣言です。なくても動くとは思いますが。 <?php $ar = array(); //任意の配列 $text = nl2br(Hq_Common::obj($job, 'free_items.22.memo')); $text =preg_replace("/(\r\n|\n|\r)*/i","",$text); //改行文字を抹消 $ar = explode("\<br\>",$text); //<br>タグ区切りで配列に格納 //配列の値ごとにlistタグで括る foreach( $ar as $val){ $list .= "<li>{$val}</li>"; } echo $list; ?>
noza

2016/06/16 09:02

追加でのご回答ありがとうございます。 試してみたのですがやはり同じように文言すべてがひとつのlistに入ってしまいうまくいきませんでした。 関数について調べてみて自分なりに試行錯誤してみようと思います。 アドバイスありがとうございました。
退会済みユーザー

退会済みユーザー

2016/06/16 09:08

横からすみません。 $ar = explode("\<br\>",$text); の部分ですがエスケープ不要だと思うので $ar = explode("<br>",$text); ではないでしょうか。
FKM

2016/06/17 00:25

$text = nl2br(Hq_Common::obj($job, 'free_items.22.memo')); の後に、 echo json_encode($text); として、どう表示されるでしょうか?もし、よければ結果を貼り付けてもらえませんか? >>hide2e3rさん そうですね。エスケープはいらないかも。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問