PHPの正規表現につきまして


変数$htmlにはhtmlのソースが入っています。(下記はダブルクオーテーションをエンマークでエスケープ済みです)
$html="<a href=\"/test/00100\" title=\"testページ\">testページ</a><a href=\"/test/00101\" title=\"testページ1\">testページ1</a>";

ここから、href属性の、「00100」「00101」の部分だけを抜き出す正規表現をご教授頂けないでしょうか?
昨日から何度やっても上手く取り出せずに困っております。

回答の条件
  • 1人2回まで
  • 13歳以上
  • 登録:2011/05/19 17:40:07
  • 終了:2011/05/19 20:23:03

ベストアンサー

id:HowAreYou No.4

HowAreYou回答回数91ベストアンサー獲得回数172011/05/19 19:51:08

ポイント22pt
(?<=パターン1)パターン2

は、「パターン1」のあとに続く「パターン2」を検索します。パターン1 はマッチに含まれません。

パターン1(?=パターン2)

は後ろに「パターン2」が続く「パターン1」を検索します。パターン2 はマッチに含まれません。

http://books.ivory.ne.jp/regexp/replace.html#lookaround

その他の回答(3件)

id:HowAreYou No.1

HowAreYou回答回数91ベストアンサー獲得回数172011/05/19 18:03:54

ポイント23pt

以下のようなコードでいかがでしょうか。

<?php
$html="<a href=\"/test/00100\" title=\"testページ\">testページ</a><a href=\"/test/00101\" title=\"testページ1\">testページ1</a>" ;

preg_match_all('#(?<=href=\"/test/).*?(?=\")#', $html, $m) ;

print_r($m) ;

出力例

Array
(
    [0] => Array
        (
            [0] => 00100
            [1] => 00101
        )

)
id:ty2016

迅速なご回答ありがとうございます。コードは完璧のようです。

もしよろしければ、第一引数のメタ文字を解説して頂けないでしょうか?

「<=」というメタ文字のところがよくわかりません。

また、デリミタでhref=\"/test/00100を囲んでいるのに、

どうして00100の部分だけを抽出できているのでしょうか?

2011/05/19 19:28:17
id:windofjuly No.2

うぃんど回答回数2625ベストアンサー獲得回数11492011/05/19 18:09:32

ポイント23pt

一例

<?php
$html='<a href="/test/test/00100" title="testページ">testページ</a><a href="/test/00101" title="testページ1">testページ1</a>';
preg_match_all('!href=.+?/(\d+)!', $html, $matches, PREG_SET_ORDER);
print_r($matches);
id:windofjuly No.3

うぃんど回答回数2625ベストアンサー獲得回数11492011/05/19 18:20:16

ポイント22pt

数字以外の可能性を考慮していなかったので例を追加

<?php
$html='<a href="/test/test/00100" title="testページ">testページ</a><a href="/test/00101" title="testページ1">testページ1</a>';
preg_match_all('!href=.+?/([^/]+?)"!', $html, $matches, PREG_SET_ORDER);
print_r($matches);
id:ty2016

迅速なご回答ありがとうございます。コードは完璧のようです。

もしよろしければ、第一引数のメタ文字を解説して頂けないでしょうか?

デリミタでhref=\"/test/00100を囲んでいるのに、

どうして00100の部分だけを抽出できているのでしょうか?

2011/05/19 19:28:26
id:HowAreYou No.4

HowAreYou回答回数91ベストアンサー獲得回数172011/05/19 19:51:08ここでベストアンサー

ポイント22pt
(?<=パターン1)パターン2

は、「パターン1」のあとに続く「パターン2」を検索します。パターン1 はマッチに含まれません。

パターン1(?=パターン2)

は後ろに「パターン2」が続く「パターン1」を検索します。パターン2 はマッチに含まれません。

http://books.ivory.ne.jp/regexp/replace.html#lookaround

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません