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

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

ただいまの
回答率

87.95%

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

受付中

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,256

score 7

管理画面に入力した項目や文言を、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>だけを挿入できれば良いのかな?と思っていました。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • kei344

    2016/06/15 11:39

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

    キャンセル

  • yambejp

    2016/06/15 11:50

    いくつか確認事項

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

    <h1>四季の種類</h1>
    <ul>
    <li>春</li>
    <li>夏</li>
    <li>秋</li>
    <li>冬</li>
    </ul>

    キャンセル

回答 3

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/16 18:03

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

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

    キャンセル

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/16 18:02

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

    キャンセル

  • 2016/06/16 18:08

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

    キャンセル

  • 2016/06/17 09:25

    $text = nl2br(Hq_Common::obj($job, 'free_items.22.memo'));
    の後に、
    echo json_encode($text);
    として、どう表示されるでしょうか?もし、よければ結果を貼り付けてもらえませんか?

    >>hide2e3rさん
    そうですね。エスケープはいらないかも。

    キャンセル

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/16 18:03

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

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

    キャンセル

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

  • ただいまの回答率 87.95%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る