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

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

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

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

正規表現

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

Q&A

解決済

1回答

341閲覧

PHP 正規表現で想定している抽出が出来ない。

sin77pan

総合スコア13

PHP

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

正規表現

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

0グッド

0クリップ

投稿2018/10/31 14:23

正規表現で想定している抽出が出来なく迷っております。

$yyyyyyy = '<a style="font-weight:bold">>>1</a> <br> あああ <br> <a style="font-weight:bold">>>2</a> いいい'; preg_match_all("/<a style=\"font-weight:bold\">>>[0-9]{1,4}</a>.*/",$yyyyyyy,$ccchhh); echo '<br>一致を表示します。<br>'; print_r($ccchhh);

とあったとしまして、これを最終的には
抽出狙いの結果1

<a style="font-weight:bold">>>1</a> <br> あああ <br>

抽出狙いの結果2

<a style="font-weight:bold">>>2</a> いいい

の2つを取得したいと思っています。

最終的には上記2つを抽出することですが
まずは例えば$yyyyyyy全体を取って、
目的2さえ取り出せば、$yyyyyyyから目的2を削除すれば
それは目的1になる、など方法の構想は練っておりました。

ところが、一致の表示の$ccchhhは以下の様になります。

一致を表示します。 Array ( [0] => Array ( [0] => >>1 あああ >>2 いいい ) )

と一つだけしか抽出結果はありません。

<a style="font-weight:bold">>>2</a> いいい

の部分はpreg_match_allで抽出してくれない状態です。

一方、あくまでhtmlタグや数字のみの抽出条件として、上記から正規表現部分の.*を取りますと

preg_match_all("/<a style=\"font-weight:bold\">>>[0-9]{1,4}</a>/",$yyyyyyy,$ccchhh);

こうしますと

一致を表示します。 Array ( [0] => Array ( [0] => >>1 [1] => >>2 ) )

ちゃんと配列で2つ、>>と数字、などが $ccchhhに格納されます。
抽出狙いの結果1、2を最初から綺麗に取り出せなくても、少なくとも2つ以上抽出できないと何も進まないと思っており、
間違い等々をご指摘頂けたら有難いです。
宜しくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

php

1<?php 2$yyyyyyy = '<a style="font-weight:bold">>>1</a> <br> あああ <br> <a style="font-weight:bold">>>2</a> いいい'; 3preg_match_all("/<a style=\"font-weight:bold\">>>[0-9]{1,4}</a>.+?(?=(<a|$))/",$yyyyyyy,$ccchhh); 4echo '<br>一致を表示します。<br>'; 5print_r($ccchhh); 6/* 出力例 7<br>一致を表示します。<br>Array 8( 9 [0] => Array 10 ( 11 [0] => <a style="font-weight:bold">>>1</a> <br> あああ <br> 12 [1] => <a style="font-weight:bold">>>2</a> いいい 13 ) 14 15 [1] => Array 16 ( 17 [0] => <a 18 [1] => 19 ) 20 21) 22*/

投稿2018/10/31 15:11

papinianus

総合スコア12705

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

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

papinianus

2018/10/31 15:15

多分これサンプル例だろうし、改行文字とかあると動かないだろうから、補足しときます。 .*だと貪欲マッチなので行端までマッチしてしまう。かといって.*?だと</a>で終わる。 ということで、肯定先読みで次に"<a"か"行端"が来るまでの最短マッチにしてみました。 .*?じゃなくて、.+?にしたのは好み
sin77pan

2018/10/31 23:44

>肯定先読みで次に"<a"か"行端"が来るまでの最短マッチ こういった手法があるとは自分の不確かな知識ではたどり着けませんでした。 希望の抽出が出来ました!有難うございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問