您好我想从网站上检索某些信息。
这是带有html标签的网站上显示的内容。
<a href="ProductDisplay?catalogId=10051&storeId=90001&productId=258033&langId=-1" id="WC_CatalogSearchResultDisplay_Link_6_3" class="s_result_name">
SALT - Fine
</a>
我想要提取的是“盐 - 精细”使用preg匹配,但我不知道为什么我不能使用它。是因为他们都在不同的线上?我意识到,如果他们在一条线上,我实际上可以找回我想要的东西。
这是我的代码 -
$pattern = '/id="WC_CatalogSearchResultDisplay_Link_6_3.*<\/a>/';
preg_match_all($pattern, $response, $match);
print_r($match);
我的数组中没有任何内容。如果它们在一条线上就有效吗?。为什么会这样?
答案 0 :(得分:2)
看看:
http://www.php.net/manual/en/reference.pcre.pattern.modifiers.php
尤其是m
和s
修饰符。
此外,我建议将模式更改为:
$pattern = '/id="WC_CatalogSearchResultDisplay_Link_6_3"[^>]*>(.*)<\/a>/ims';
否则,您将匹配a-tag
的结尾。
另外,不使用正则表达式来解析html / xml 。
这样的事情:
<?php
$dom = DOMDocument::loadHtml($response);
$xpath = new DOMXPath($dom);
$node = $xpath->query('//*[@id="WC_CatalogSearchResultDisplay_Link_6_3"]/text()')->item(0);
if ($node instanceof DOMText) {
echo trim($node->nodeValue);
}
也会起作用,而且会更强大。
答案 1 :(得分:1)
您应该通过()
封装您想要匹配的内容。所以我猜你的模式会变成
$pattern = '/id="WC_CatalogSearchResultDisplay_Link_6_3(.*)<\/a>/';
但是我没有完全看到你是如何达到这种模式的,因为只需匹配a-tags所包含的所有东西就更简单了。
修改强>
您还需要Yoshi提到的s修饰符,以便.
匹配换行符。因此我建议你使用这段代码:
$pattern = '/<a[^>]*>(.+)<\/a>/si';
preg_match_all($pattern, $response, $match);
print_r($match);
答案 2 :(得分:1)
你是对的,这是因为它是一个多行输入字符串。
您需要将m
和s
修饰符添加到正则表达式模式以匹配多行字符串:
$pattern = '/id="WC_CatalogSearchResultDisplay_Link_6_3.*<\/a>/ms';
m
修饰符使其成为多行。
s
修饰符使.
点匹配换行符以及所有其他符号(默认情况下与换行符不匹配)