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

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

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

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

Q&A

解決済

3回答

6413閲覧

記事の中の<h2>タイトル</h2>タグを取得して表示するPHP

bgmapinds

総合スコア17

PHP

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

0グッド

0クリップ

投稿2017/03/22 08:35

編集2017/03/22 09:24

記事の中の<h2>タイトル</h2>タグを取得して表示するPHPなのですが、文書には三つ<h2>タイトル</h2>があり、下記のPHPで表示させると、<h2>タイトル</h2><h2>タイトル</h2><h2>タイトル</h2>の表示になりました。

これをそれぞれ、分けて表示するにはどうしたらよいでしょうか。
↓↓

一つ目の<h2>タイトル</h2>
二つ目の<h2>タイトル</h2>
三つ目の<h2>タイトル</h2>

一つ目の、二つ目のと文字を足して、分けて表示したい場合はどうすれば良いのでしょうか。
PHPを勉強してまして、初心者ですがご教授くださいますと本当に感謝します。お願いします。

//functions.phpに定義する関数
function get_index() {
//グローバル変数を使う為の宣言
global $post;
//マッチングで<h>タグを取得する
preg_match_all('/<h2>.+</h2>/u', $post->post_content, $matches);
//取得した<h>タグの個数をカウント
$matches_count = count($matches[0]);
if(empty($matches)){
//<h>タグがない場合の出力
echo '<span>Sorry no index</span>';
}else{
//<h>タグが存在する場合に<h>タグを出力
for ($i = 0; $i < $matches_count; $i++){
echo $matches[0][$i];
}
}
}

以上です。

表示は<?php echo the_content(); ?>で行いました。

*追記 <h2\s.+>は<h2>の間違いでした申し訳ございません。

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

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

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

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

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

guest

回答3

0

正規表現のパターンがちょっとおかしいです
「<h2\s.+>」だと「<h2 xxx>」的なモノにしかヒットしません
また最短マッチなどの設定も必要です。
こんな風にしてみてはどうでしょうか?

PHP

1$str=<<<eof 2<h2>タイトルA</h2> 3<p>test</p> 4<p>test</p> 5<h2 class="hoge">タイトルB</h2> 6<p>test</p> 7<p>test</p> 8<h2 id="fuga">タイトルC</h2> 9<p>test</p> 10<p>test</p> 11eof; 12 13$pattern='/<h2(?:|\s.+?)>.+?<\/h2>/m'; 14preg_match_all($pattern, $str, $matches); 15print_r($matches);

投稿2017/03/22 09:14

yambejp

総合スコア114779

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

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

bgmapinds

2017/03/22 09:31

回答ありがとうございます。この方法もわかり本当に答えていただき感謝します
guest

0

ベストアンサー

コードの参考にしたであろうサイト
wordpressで投稿内容(記事本文)からhタグを取得し目次として使用する

に答えがそのまま書いてある気がしますがこの方法では駄目だったのでしょうか?

投稿2017/03/22 09:11

iss

総合スコア506

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

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

bgmapinds

2017/03/22 09:19

ご回答ありがとうございます。すいません、その通りです。この方のPHPを見て勉強していました。 私の説明が不十分でした。記事の中に出てくる二つ目の<h2>test1</h2>のみを選択して表示したい場合はどうすれば良いという率直な質問をすべきでした。すいません(´;ω;`)ウッ…
iss

2017/03/22 09:26 編集

単純に2つ目だけを固定で出力したいというのであれば、 echo $matches[0][$i]; の箇所のforループをやめて、echo $matches[0][1];だけの指定にすれば 2個目だけが出力できたりしませんか?
bgmapinds

2017/03/22 09:32

ありがとうございます。出来ました。勉強になりました。7ueさん本当にありがとうございます<m(__)m>
guest

0

正規表現に問題があります。

正規表現は基本的に最も長くマッチする文字列を取得しようとします。例えば、「<h2></h2>」にマッチする正規表現を「<h2>test1</h2><h2>test2</h2>」に適用すると、(test1やtest2の片方だけではなく)全体にマッチしてしまいます。
質問に書いてあるコードだと、1つ目のH2要素から最後のH2要素まで全てにマッチしてしまう正規表現になっているため、うまく動いていません。

対策としては、「+」や「」の代わりに「+?」や「?」を利用すると最も短くマッチする文字列にマッチするようになり、うまく動くようになります。

php

1//functions.phpに定義する関数 2function get_index() { 3 global $post; 4 5 //マッチングで<h>タグを取得する 6 preg_match_all('/<h2.*?>.+?<\/h2>/u', $post->post_content, $matches); 7 8 //取得した<h>タグの個数をカウント 9 $matches_count = count($matches[0]); 10 if(empty($matches)){ 11 //<h>タグがない場合の出力 12 echo '<span>Sorry no index</span>'; 13 }else{ 14 //<h>タグが存在する場合に<h>タグを出力 15 for ($i = 0; $i < $matches_count; $i++){ echo $i . ":" . $matches[0][$i]. "\n"; } 16 } 17} 18

投稿2017/03/22 09:09

ku__ra__ge

総合スコア4524

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

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

bgmapinds

2017/03/22 09:17

ご回答ありがとうございます。すいません。私の説明が不十分でした。記事の中に出てくる二つ目の<h2>test1</h2>のみを表示したい場合はどうすれば良いという率直な質問をすべきでした。すいません。もしわかるようなご教授願います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問