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

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

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

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

Q&A

解決済

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

RyoUY
RyoUY

総合スコア29

正規表現

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

1回答

0グッド

0クリップ

235閲覧

投稿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の問題があるのかもしれません。

以下のような質問にはグッドを送りましょう

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

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

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

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

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

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

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

適切な質問に修正を依頼しましょう。

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

回答1

1

ベストアンサー

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

総合スコア109126

RyoUY😍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

回答へのコメント

RyoUY

2022/12/05 06:53

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

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

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

正規表現

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