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

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

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

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

Q&A

解決済

1回答

513閲覧

正規表現で抽出したい単語を抽出できない

RyoUY

総合スコア29

正規表現

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

0グッド

0クリップ

投稿2022/12/02 09:10

前提

PHPでフレームワークを使用しないでWebページを作成しています。
その中で、正規表現を使って、DBからテキストを抽出する処理があるのですが、抽出したい単語が抽出できません。

実現したいこと

抽出対象の文言:

<p>私は<span class="strawberry">とちおとめ</span>を食べました。</p> <p>私は<span class="grape strawberry">シャインマスカットととちおとめ</span>を食べました。</p>

正規表現:

<span class=".*?strawberry.*?">(.+?)<\/span>

期待する抽出結果:

とちおとめ シャインマスカットととちおとめ

実際の抽出結果:

とちおとめ

聞きたいこと

どのような正規表現を記載すれば、期待する結果を抽出できるか教えていただけないでしょうか。
もしかすると正規表現ではなく、PHPやSQLの問題があるのかもしれません。

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

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

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

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

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

yambejp

2022/12/02 09:16

SQLの種類とバージョンを提示ください。 正規表現は負荷が高いため必ずしもDBの単語の抽出には向いていません また入れ子の発生するXML系の文字列との相性はわるいです
otn

2022/12/02 09:28

正規表現としては間違ってません。
yuma.inaura

2022/12/02 10:10

PHPではどう書いてるんでしょうか?
RyoUY

2022/12/05 06:47

yambejpさん 正規表現は負荷が高いことを知りませんでした。確かに正規表現で入れ子の文字列を抽出するのに苦労しました。そもそも正規表現以外の方法を考えた方が良さそうですね。
RyoUY

2022/12/05 06:48

otnさん 間違っていないのですね。正規表現チェッカーサイトで見ても問題なかったので、正規表現以外の場所に問題がありそうです。
guest

回答1

0

ベストアンサー

DBからヒットさせるのではなく単純にHTMLからPHPで文字列を抽出したいならこんな感じです

PHP

1$str=<<<eof 2<p>私は<span class="strawberry">とちおとめ</span>を食べました。</p> 3<p>私は<span class="grape strawberry">シャインマスカットととちおとめ</span>を食べました。</p> 4eof; 5$content = mb_convert_encoding($str, 'HTML-ENTITIES', 'UTF-8'); 6$dom = new DOMDocument(); 7$dom->loadHTML($content); 8$xpath = new DOMXPath($dom); 9$vals=array_map(function($x){ 10 return $x->nodeValue; 11},iterator_to_array($xpath->query('//span[contains(@class,"strawberry")]'))); 12print_r($vals);

投稿2022/12/02 11:08

yambejp

総合スコア114843

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

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

RyoUY

2022/12/05 06:53

ありがとうございます! 頂いた回答をもとに修正したところ、無事取得できました。とても苦労していたので、大変助かりました!! HTMLエンティティに変換するmb_convert_encoding、 ノードを指定して操作するDOMDocument、 HTML文章中の要素を指定できるDOMXPath、 配列の要素に対して同じ処理を実行するarray_map、 関数名を指定せずに関数を作成する無名関数、 不規則な多次元配列を出力できるiterator_to_array など、私の知らなかったことばかりで大変勉強になりました。精進します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問