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

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

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

特殊な記法により文書に埋め込む形で記述される付加情報をタグと呼びます。文書構造や書式、文字飾りなどを指示したり、画像や他の文書へのリンクを埋め込むことができる。

PHP

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

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

4回答

15431閲覧

PHP タグの中身を正規表現で取得したい

ckaposndbbba

総合スコア210

タグ

特殊な記法により文書に埋め込む形で記述される付加情報をタグと呼びます。文書構造や書式、文字飾りなどを指示したり、画像や他の文書へのリンクを埋め込むことができる。

PHP

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

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

1グッド

3クリップ

投稿2015/05/03 15:14

こんにちは.
たとえば以下のようなHTMLがあるとします.

lang

1<div class="item">あ</div> 2<p class="item">い</p> 3<p class="item special">う</p> 4<div class="teratail item special">え</div> 5<div>お</div>

それで,.itemの中身をPHPで取得しようとしました.

lang

1preg_match_all("/\<.*? class=[\"|\'].*?item.*?[\"|\']>(.*?)<\/.*?>/", $html, $result);

しかし,できません.(ほんとは,「あ」「い」「う」「え」がarrayとして帰ってきてほしい)
なぜでしょうか?
一生懸命初心者ながら自分で正規表現書いてみたのですが,よくわからず・・・
よろしくおねがいします.

---追記---
元になるHTMLにタブや改行が入っていました.

lang

1<div class="item"> 23</div> 4 5<p class="item">い</p> 6 7<p class="item special"> 8 う</p> 9 10<div class="teratail item special">え 11</div> 12 13<div> 1415</div>

度々すみません,タブや改行を無視する方法はありませんでしょうか?

daihi👍を押しています

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

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

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

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

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

guest

回答4

0

返ってきているようですよ。

lang

1var_dump($result); 2結果 3array(2) { 4 [0]=> 5 array(4) { 6 [0]=> 7 string(27) "<div class="item">あ</div>" 8 [1]=> 9 string(23) "<p class="item">い</p>" 10 [2]=> 11 string(31) "<p class="item special">う</p>" 12 [3]=> 13 string(44) "<div class="teratail item special">え</div>" 14 } 15 [1]=> 16 array(4) { 17 [0]=> 18 string(3) "あ" 19 [1]=> 20 string(3) "い" 21 [2]=> 22 string(3) "う" 23 [3]=> 24 string(3) "え" 25 } 26}

投稿2015/05/03 16:03

otn

総合スコア84538

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

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

0

こんにちは。

$result[1] に返ってきていますよ、という結論は先の回答者の方と
同じなのですが、一点だけ、蛇足かとは思うのですが、気になった点を
回答します。

挙げられている正規表現だと、

クラスとして、item を部分文字列として含むようなクラス名を持つ要素の内容

が取得されます。たとえば、例のHTMLを以下の
ように若干修正します。

lang

1<div class="item">あ</div> 2<p class="items-list">い</p> 3<p class="item special">う</p> 4<div class="teratail item special">え</div> 5<div class="not-item">お</div>

変更点は以下の2点です。

  1. 「い」を囲む<p>のclassを、items-list に変更
  2. 「お」を囲む<div>に、class="not-item"を追加

上記のように修正したHTMLに対して、挙げられている正規表現
でマッチングさせ、var_dump で $result[1]を見ると、以下
のようになっているかと思います。

lang

1array(5) { 2 [0]=> 3 string(3) "あ" 4 [1]=> 5 string(3) "い" 6 [2]=> 7 string(3) "う" 8 [3]=> 9 string(3) "え" 10 [4]=> 11 string(3) "お" 12 }

すなわち、クラスが items-list である「い」、およびクラスが
not-item である「お」も取得されます。
ですので、ご質問の中にあった、

それで,.itemの中身をPHPで取得しようとしました.

に厳密に沿ったものにするならば、正規表現を少し手直しする必要が
ありそうです。

もちろん、他のHTMLのことは考えなくてよく、最初の例で挙げらている
HTMLの .item の中身が取れたらそれでいいという状況なら、挙げられ
ている正規表現でも目的は果たせています。
ただ、もし今回のコードが、正規表現の練習という意味合いであるならば、
挙げられている正規表現だと、

lang

1<p class="items-list">い</p>

lang

1<div class="not-item">お</div>

もマッチしてしまうので、

.itemの中身

だけを取ってくるものにはなっていないということを、
蛇足ながら付言させて頂きました。

蛇足と言いながらこんなに長い回答になってしまったついでに、と
言っては恐縮ですが、応用として上記の修正したHTMLで、クラス名が
items-list や not-item といったものはマッチせず、結果
として、「あ」、「う」、「え」だけを取ってくるための正規表現
を考えてみるのも練習になるかもしれません。

以上です。

投稿2015/05/03 22:37

編集2015/05/03 23:18
jun68ykt

総合スコア9058

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

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

0

こんにちは。2回目の回答になります。

タブや改行を無視する方法はありませんでしょうか?

との追記があったので、これについて回答したいと思いますが、
ご質問のタイトル「タグの中身を正規表現で取得したい」からは
ちょっと離れますので、その点だけご容赦ください。

 HTMLの中にタブや改行がどのように入ってきても、あるクラスを持った
要素の中にあるテキストを取り出せるプログラムを作るには、自分で
正規表現を書くという方法ではつらくなってきます。なぜかというと、
HTMLの要素の区切りにタブや改行がどのようなパターンで入ってくる
かは、無数の組み合わせがあるからです。
目的の要素からテキストを取り出すのに、自分で正規表現を書くのとは
別の選択肢として、HTMLをパース(解析)し、取り出したい要素を指定
して、それらの要素の持つテキストを集めてくるようなプログラムを
書く方法があります。そのようなプログラムを作るには、HTMLパーサー
を使うのですが、PHPのHTMLパーサーとしては、

PHP Simple HTML DOM Parser

というのが、よく知られています。(他にも、より性能が良いものがある
らしいのですが、それについてはここでは触れません。)これを使うと、
クラスに item を持っている要素のテキストを、(WEBブラウザ上に)一覧
するプログラム

・list-item-contents.php

は、たとえば以下のように書けます。

lang

1<?php 2 require_once 'simple_html_dom.php'; 3 4 $html = file_get_html( 'input.html' ); 5?> 6<!DOCTYPE html> 7<html> 8<head> 9<meta charset="UTF-8"> 10<title>list-item-contents.php</title> 11</head> 12<body> 13<pre> 14<?php foreach ( $html->find( '.item') as $item ) { 15 $text = trim($item->innertext); 16 echo $text . "\n"; 17} ?> 18</pre> 19</body> 20</html> 21<?php 22 $html->clear(); 23 unset($html); 24?>

上記の list-item-contents.php では、初めに

lang

1 require_once 'simple_html_dom.php';

としていますが、この simple_html_dom.php は以下

http://sourceforge.net/projects/simplehtmldom/files/

からダウンロードして入手します。
また、処理の対象として読み込むHTMLファイル名を

・input.html

としています。たとえば input.html として

lang

1<!DOCTYPE html> 2<html> 3<head> 4<meta charset="UTF-8"> 5<title>questions/9375/input.html</title> 6</head> 7<body> 8<div class="item"> 910</div> 11 12<p class="item">い</p> 13 14<p class="item special"> 15 う</p> 16 17<div class="teratail item special">え 18</div> 19 20<div> 2122</div> 23</body> 24</html>

を、先の list-item-contents.php に処理させると、結果として

lang

1234

と、ブラウザ上に表示されます。

input.html の要素の区切りとしてタブや改行が、どのように入っても
list-item-contents.phpを修正することなく、同じ結果が得られる
はずです。

以上、HTMLから欲しい情報を取り出すときに、自分で正規表現を書く手法
とは別の方法となりますが、参考になれば幸いです。

投稿2015/05/05 01:47

編集2015/05/05 02:22
jun68ykt

総合スコア9058

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

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

0

こんにちは
preg_match_all関数ですが
4番目の引数にflagsを渡せます。

flagsを指定しない場合
デフォルトでPREG_PATTERN_ORDERが指定されます。
PREG_PATTERN_ORDERを指定すると以下の挙動になります。

PREG_PATTERN_ORDER $matches[0] はパターン全体にマッチした文字列の配列、 $matches[1] は第 1 のキャプチャ用サブパターンにマッチした文字列の配列、 といった順番となります。

今回取得したいのはキャプチャした文字列の配列なので
$result[1]
で取得できると思います。

投稿2015/05/03 16:05

YutaOchiai

総合スコア10

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問