[PHP-users 35237] Re: preg_match_allによる要素の抽出

Ryo Takeguchi takegu @ takegu.com
2010年 6月 16日 (水) 17:23:46 JST


こんにちは。
たけぐちです。

セールは考えないとした場合は
preg_match_all("/<a name=\"(\d*)\" href.*?<span
class=\"teika\">定価:(.*)円<\/span><br \/>/s", $html_source, $matches,
PREG_SET_ORDER);
に
/s を /Us
で
preg_match_all("/<a name=\"(\d*)\" href.*<span
class=\"teika\".*定価:(.+)円<\/span><br \/>/Us", $html_source, $matches,
PREG_SET_ORDER);
で一応でます。

正規表現で全部引っ張ろうとするとぐちゃぐちゃになってしまう(自分だけかもしれませんが)ので、Setoさんのおっしゃる通りデータを加工したほうがいいかと。

セールが有る無しだけで記述の揺れがないと考えれば、

<a から 次の<a までの間が一つのデータと考え分割

それを繰り返しで
spanで指定されているclassと
<span></span>含まれる文字列を取得

必要なものだけとりだしてハッシュなりに入れる。

対象の内容によりけりですが、htmlは改行の意味が無く処理する上で
邪魔なことがあるので
$html_source=preg_replace("/\n/",'',$html_source);
などで捨ててます。
あ、preg_replaceである必要はないです。好みです。

正規表現はマッチする最初のほうからちょこちょこ広げていったほうが作りやすいかと思います。

-- 
takegu


PHP-users メーリングリストの案内