2012-12-23 112 views
1

我做一個簡單的應用程序,才能從像allrecipes.com.我使用preg_match網站食譜的信息,但有什麼不工作。問題與的preg_match

$geturl = file_get_contents("http://allrecipes.com/Recipe/Brown-Sugar-Smokies/Detail.aspx?src=rotd"); 
      preg_match('#<title>(.*) - Allrecipes.com</title>#', $geturl, $match); 
      $name = $match[1]; 
      echo $name; 

我只是想取頁(減去- Allrecipes.com部分)的標題,並把它變成一個變量,但一切變成了空白。

+0

您是否嘗試過打印'$ geturl',看見如果字符串其實有? – Ryan

+0

您缺少解決您的代碼問題。例如,在使用它們之前檢查返回值。 – hakre

+0

@minitech,是啊,當我打印'$ geturl',我得到了整個 – Muhambi

回答

2

這種模式有兩個問題。首先,有所述<title>後一個新行符號它完全不會受到.捕獲(如無/s改性劑.字面上「的任何符號但EOL一個」)。其次,Allrecipes.com文本實際上並沒有跟着</title>子串,有一個換行符將它們分開。

考慮到\s涵蓋了正常的空白和行分隔一個事實,你可以改變你的正則表達式是這樣的:

'#<title>\s*(.*?) - Allrecipes.com\s*</title>#s' 

/s修飾符是不是在這裏實際上相關(CUDOS到MiniTech移動的注意到, ),因爲此配方中的標題爲單行,並且所有「\ n」符號將由\s*子表達式覆蓋。但我仍然建議將它留在那裏,這樣多線遊戲不會讓你感到不適。

爲了提高效率,我將.*替換爲.*?:因爲您要查找的字符串非常短,所以在此使用非貪婪量詞很有意義。

+0

''不緊跟'Allrecipes.com',無論是。 – Ryan

+3

雖然現在爲什麼's'修飾符相關?食譜名稱中沒有換行符*。 – Ryan

+0

當然你是對的;雖然這個常見的問題不是\ n「的問題,但是這裏唯一的問題是,實際上,OP應該在''之前覆蓋了正則表達式中的填充。 – raina77ow

3

如果你看一下頁面的源代碼,你會發現,<title>包含各地的實際文本,以便您需要彌補一些填充。

'#<title>\s*(.*) - Allrecipes.com\s*</title>#' 
1

你應該得到整個標題,然後再使用PHP剝光它,就像這樣:

<?php 

$raw_html=file_get_contents('http://www.allrecipes.com'); 
if (empty($raw_html)) { 
    throw new \RuntimeException('Fetch empty'); 
} 

$matches=array(); 
if (preg_match('/<title>(.*)<\/title>/s', $raw_html, $matches) === false) { 
    throw new \RuntimeException('Regex error'); 
} 

$title=trim($matches[1]); 

// you should strip your title here 
echo $title;