人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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」の部分だけを抜き出す正規表現をご教授頂けないでしょうか?
昨日から何度やっても上手く取り出せずに困っております。


●質問者: ty2016
●カテゴリ:ウェブ制作
✍キーワード:href HTML PHP test エスケープ
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● HowAreYou
●23ポイント

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

<?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
 )

)
◎質問者からの返答

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

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

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

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

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


2 ● うぃんど
●23ポイント

一例

<?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);

3 ● うぃんど
●22ポイント

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

<?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);
◎質問者からの返答

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

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

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

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


4 ● HowAreYou
●22ポイント ベストアンサー
(?<=パターン1)パターン2

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

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ