如何在php中使用preg匹配?

时间:2011-05-19 13:48:23

标签: php preg-match

您好我想从网站上检索某些信息。

这是带有html标签的网站上显示的内容。

    <a href="ProductDisplay?catalogId=10051&amp;storeId=90001&amp;productId=258033&amp;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);

我的数组中没有任何内容。如果它们在一条线上就有效吗?。为什么会这样?

3 个答案:

答案 0 :(得分:2)

看看:

http://www.php.net/manual/en/reference.pcre.pattern.modifiers.php

尤其是ms修饰符。

此外,我建议将模式更改为:

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

你是对的,这是因为它是一个多行输入字符串。

您需要将ms修饰符添加到正则表达式模式以匹配多行字符串:

$pattern = '/id="WC_CatalogSearchResultDisplay_Link_6_3.*<\/a>/ms';

m修饰符使其成为多行。

s修饰符使.点匹配换行符以及所有其他符号(默认情况下与换行符不匹配)