2010-08-22 68 views
0

我遇到了preg_match的一個奇怪問題。我使用的是正則表達式,抓住文章的標題,基本上查找標籤:PHP使用preg_match從文章中獲得標題

preg_match('#(\<title.*?\>)(\n*\r*.+\n*\r*)(\<\/title.*?\>)#', $data, $matches) 

當我打印出來的$匹配陣列我什麼也沒得到。但是當我在正則表達式測試中嘗試相同的東西時,它工作正常。我甚至嘗試過放入一個肯定會匹配它的字符串來代替$ data變量,沒有任何運氣。

我在這裏做錯了什麼?

+0

你試圖匹配從標籤或某事一個XML文件..你可以更具體一些,並提供一些你想要匹配的字符串的例子:) – 2010-08-22 14:03:56

+0

不應該使用正則表達式來解析HTML或XML結構 – 2010-08-22 14:07:16

+4

你應該使用PHP的本地DOM函數:http ://www.php.net/manual/en/book.simplexml.php – 2010-08-22 14:08:18

回答

0

您可能需要反斜槓 - 引用您的反斜槓。

PHP的字符串解析器刪除了一層反斜槓,然後正則表達式引擎消耗另一層,因此(例如)識別反斜槓在源代碼中需要四個反斜槓。除此之外,您可能會嘗試利用PHP中的XML識別內容,或者做更少的巧妙的字符串處理。通常當REGEX中斷時,這是因爲你試圖對他們太聰明。考慮只爲尋找了「,並刪除整個標題標籤,然後剝離空白出字符串的,瞧!冠軍。也

http://php.net/manual/en/book.simplexml.php

0

試試這個

if (preg_match('%(<title.*?\b(?!\w))(\n*\r*.+\n*\r*)(\b(?=\w)/title.*?\b(?!\w))%', $data, $matches)) { 
    $title = $matches[1]; 
} else { 
    $title = ""; 
} 
6

如果您仍然想使用regex,而不是DOM,這裏是你可以做什麼:

if(preg_match("/<title>(.+)<\/title>/i", $data, $matches)) 
    print "The title is: $matches[1]"; 
else 
    print "The page doesn't have a title tag"; 
+0

謝謝,這個作品。猜猜我只是讓它太複雜了。雖然不確定它爲什麼能在測試儀中工作,而不是在實際腳本中。 – pfunc 2010-08-22 14:13:55

+0

不客氣。只要遵循KISS原則。 – shamittomar 2010-08-22 14:14:55

+0

@pfunc,我這樣做(快速和骯髒),它工作得很好,並顯示頁面的標題。我想你必須使用'echo $ matches [2];'來使它工作。 $ data = file_get_contents(「http:// localhost /」); (\ n * \ r *。+ \ n * \ r *)(\ <\/title.*?\>)#',$ data,$ matches); echo $ matches [2]; – shamittomar 2010-08-22 14:19:32

0

像其他人一樣,這有「使用相提並論系列,而不是正則表達式「免責聲明。不過,如果你還是想正則表達式,看看這個:

$string = "<title>I am a title</title>"; 
$regex = "!(<title[^>]*>)(.*)(</title>)!i"; 
preg_match($regex, $string, $matches); 
print_r($matches); 

//should output: 
array(
    [1] => "<title>" 
    [2] => "I am a title" 
    [3] => "</title>" 
) 
1

或者你可以使用,你知道,對HTML HTML解析器:

$dom = new domDocument; 
$dom->loadHTML($HTML); 

echo $dom->getElementsByTagName('title')->item(0)->nodeValue; 
+0

我更喜歡自己使用SimpleHTMLDOM擴展,但此方法不需要外部庫。 – Erik 2010-08-22 14:38:40

+0

是的,但DOMDocument在標記有效性方面相當嚴格。它不會在很多頁面上工作。 – 2010-08-22 14:39:51

+0

當您使用' - > loadHTML()'時會出現錯誤,您會驚訝它會處理損壞的HTML – Erik 2010-08-22 16:30:42