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

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

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

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

正規表現

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

Q&A

2回答

1216閲覧

正規表現で部分文字列を取り出す

ssssskkkkk

総合スコア20

PHP

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

正規表現

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

0グッド

1クリップ

投稿2019/06/10 10:41

phpで次の文字列から class="test" id="test"を個別に取り出したいと考えています。

php

1$text = "<p class=\"test\" id=\"test\">";

そこで以下のコードを試してみましたが、

php

1<?php 2$text = "<p class=\"test\" id=\"test\">"; 3$pattern = "/<p( +.*=(\".*\"))*>/"; 4$matches = []; 5preg_match($pattern, $text, $matches); 6var_dump($matches); 7?>

結果は

array(3) { [0]=> string(26) "<p class="test" id="test">" [1]=> string(23) " class="test" id="test"" [2]=> string(6) ""test"" }

となってしまいました。
上記のような結果ではなく、

array(3) { [0]=> string(26) "<p class="test" id="test">" [1]=> string(13) " class="test"" [2]=> string(10) " id="test"" }

となることを期待しています。

今回用いたパターンは

php

1$pattern = "/<p( +.*=(\".*\"))*>/";

ですが、どのようにすれば期待した結果になるでしょうか。
よろしくお願いいたします。

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

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

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

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

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

papinianus

2019/06/10 22:36

classやidは固定ですか?htmlの開始タグのみが渡されるのは固定ですか?
ssssskkkkk

2019/06/11 10:00

classやidは固定ではなく様々な属性に対応させたいと考えています。 今回は属性を取り出せれば良いので終了タグは考慮していません。
guest

回答2

0

HTML要素の属性などを抜くときには正規表現よりDOM処理の方が楽です

PHP

1$text = "<p class= \"testhoge testfuga\" id='testpiyo' data-test='class=\"nisemono\"'>p</p>"; 2$doc=new DOMDocument(); 3$doc->loadHTML($text); 4$node = $doc->getElementsByTagName("p")[0]; 5print "class:".$node->getAttribute("class")."<br>"; 6print "id:".$node->getAttribute("id")."<br>";
  • エンクロージャーが不定
  • 余分な空白文字を気にする必要がある
  • ニセデータが混ざる可能性がある

投稿2019/06/11 00:50

yambejp

総合スコア114572

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

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

ssssskkkkk

2019/06/11 09:58

ありがとうございます。 教えていただいた方法を試してみたところ、属性を抜き出すことができましたが、今回は正規表現で実装したいので、引き続き正規表現での取り出し方を探していきたいと思います。
yambejp

2019/06/12 01:53

正規表現はしょせん文字列のマッチングでしか無いので HTML要素における属性の解釈が中途半端にしかできません 前述したような特殊な例が含まれると急激に難易度があがります。 まぁ向学のためやってみたいなら止めないですが 無理なものは無理だと認識しておいたほうがよいですよ
ssssskkkkk

2019/06/12 10:02

もう少しやってみて無理そうであれば諦めます。 ありがとうございます。
guest

0

正規表現はそのまま使用すると最長パターンを探します。
最短パターンにマッチングさせると良いです。

検証用サイト
regexper
regex101

投稿2019/06/10 10:45

編集2019/06/10 10:54
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

ssssskkkkk

2019/06/10 10:52

最短パターンにマッチさせようとして最初に思いつくのが $pattern = "/<p( +.*=(\".*?\"))*>/";  (分かりづらいですが、\".*\" -> \".*?\" に変更しています) なのですが、これでも結果は変わりませんでした。 どのように記述するとうまく最短パターンにマッチさせられるのでしょうか。
退会済みユーザー

退会済みユーザー

2019/06/10 10:55

検証用のサイトを追記しました。
ssssskkkkk

2019/06/10 10:56

試してみます!ありがとうございます。
ssssskkkkk

2019/06/10 13:21

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問