2011-05-19 71 views
1

嗨,我想從網站檢索某些信息。如何在PHP中使用preg匹配全部?

這是用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 match的「SALT - FINE」,但是我不知道爲什麼我不能使用它。是因爲他們都在不同的線上?因爲我知道如果他們在一條線上,我實際上可以找回我想要的東西。

這是我的代碼 -

$pattern = '/id="WC_CatalogSearchResultDisplay_Link_6_3.*<\/a>/'; 
preg_match_all($pattern, $response, $match); 
print_r($match); 

我沒有得到我的數組中的任何。如果他們在一條線上工作,那麼爲什麼?

回答

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

也將工作,會有很多更穩健。

+0

沒有regexs解析應該得到upvotes – 2011-05-19 15:23:27

1

你應該封裝你想要匹配的東西()。所以我想那麼你的模式將成爲

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

然而,我並不完全看你怎麼來到這個模式,因爲它是簡單的只是比賽的一切由標籤包圍。

編輯: 您還需要S修正由耀西提到所以.換行符相匹配。因此,我建議您使用此代碼:

$pattern = '/<a[^>]*>(.+)<\/a>/si'; 
preg_match_all($pattern, $response, $match); 
print_r($match); 
1

你是對的,這是因爲它是一個多行輸入字符串。

您需要的ms改性劑添加到正則表達式匹配多行字符串:

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

m修飾使得它多。

s修改使得.點匹配換行符以及所有其他(默認情況下它不匹配換行符)