すでに HTML パーサーを使用している場合 (SimpleHtmlDom のような貧弱なパーサーであっても)、なぜ正規表現で混乱させようとするのでしょうか? それはメスを使って患者の体を開き、実際の手術では鋭利なスプーンに戻るようなものです。
SimpleHtmlDom はコードベースが貧弱であり、libxml ベースのパーサーよりもはるかに遅いため、誰も使用すべきではないと強く信じているため、PHP のネイティブ DOM 拡張機能とXPathを使用してそれを行う方法を次に示します。XPath は事実上、X(HT)ML ドキュメントの正規表現または SQL です。それを学べば、二度と HTML の正規表現に触れる必要がなくなります。
$dom = new DOMDocument;
libxml_use_internal_errors(true);
$dom->loadHTMLFile('https://laperuanavegana.wordpress.com/2011/06/11/ensalada-tibia-de-quinua-mango-y-tomate/');
libxml_clear_errors();
$recipe = array();
$xpath = new DOMXPath($dom);
$contentDiv = $dom->getElementById('content');
$recipe['title'] = $xpath->evaluate('string(div/h2/a)', $contentDiv);
foreach ($xpath->query('div/div/ul/li', $contentDiv) as $listNode) {
$recipe['ingredients'][] = $listNode->nodeValue;
}
print_r($recipe);
これは出力されます:
Array
(
[title] => Ensalada tibia de quinua, mango y tomate
[ingredients] => Array
(
[0] => 250gr de quinua cocida tibia
[1] => 1 mango grande
[2] => 2 tomates
[3] => Unas hojas de perejil
[4] => Sal
[5] => Aceite de oliva
[6] => Vinagre balsámico
)
)
解析しているのではなくhttp://laperuanavegana.wordpress.com/
、実際のブログ投稿であることに注意してください。ブログの所有者が新しい投稿を追加するたびに、メイン URL のコンテンツが変更されます。
メインページからすべてのレシピを取得するには、次を使用できます
$dom = new DOMDocument;
libxml_use_internal_errors(true);
$dom->loadHTMLFile('https://laperuanavegana.wordpress.com');
libxml_clear_errors();
$contentDiv = $dom->getElementById('content');
$xp = new DOMXPath($dom);
$recipes = array();
foreach ($xp->query('div/h2/a|div/div/ul/li', $contentDiv) as $node) {
echo
($node->nodeName === 'a') ? "\n# " : '- ',
$node->nodeValue,
PHP_EOL;
}
これは出力されます
# Ensalada tibia de quinua, mango y tomate
- 250gr de quinua cocida tibia
- 1 mango grande
- 2 tomates
- Unas hojas de perejil
- Sal
- Aceite de oliva
- Vinagre balsámico
# Flan de lúcuma
- 1 lúcuma grandota o 3 pequeñas
- 1/2 litro de leche de soja evaporada
…
等々
こちらもご覧ください