2010-03-11 46 views
0

我想使用preg_replace從遠程頁面獲取一些數據,但是我在處理模式時遇到了一些問題。preg_replace地獄

function getData($Url){ 
    $str = file_get_contents($Url); 
    if(strlen($str)>0){ 
     preg_match("/\<span class=\"SectionHeader\"\>title\</span>/<br/>/\<div class=\"header2\"\>(.*)\</div\></span\>/",$str,$title); 
     return $title[1]; 
    } 
} 

這裏的HTML作爲是我結束了在其擲百萬斜線之前(貌似我忘了部分或兩個):

<span class="cell CellFullWidth"><span class="SectionHeader">mytitle</span><br/><div class="Center">Event Name</div></span> 

事件名稱是我想要的數據返回我的功能。

非常感謝很多人,這是一個痛苦的屁股。

+0

我不會用十英尺的杆子碰這個。要獲得標題的方式要比掃描整個頁面進行比賽更有效。你知道preg_match將返回一個數組,如果它爲該條件找到多個匹配,那麼正確嗎? – animuson

+0

我會用一個html解析器,比如http://simplehtmldom.sourceforge.net/ – marvin

+0

就像之前很多次一樣,我建議不要使用正則表達式來解析HTML,因爲它們不適合這樣做。改爲使用HTML解析器。 –

回答

0

雖然我傾向於提意見,這是不是一個漂亮的解決方案達成一致,這是我的發言未經測試的版本:

preg_match('#\<span class="SectionHeader"\>title\</span\>/\<br/\>/\<div class="header2"\>(.*)\</div\>\</span\>#',$str,$title); 

我改變了雙引號的字符串單引號,你AREN不使用任何雙引號字符串的變量替換特徵,這樣就避免了必須反斜槓轉義雙引號以及避免對反斜線的任何歧義(這可能應該加倍以產生正確的字符串 - 請參閱the php manual on strings )。我將斜線/分隔符更改爲散列#,因爲匹配模式中出現的斜槓數量(其中一些在您的版本中未反斜槓)。

0

有不少東西錯了你的表達:

  • 您使用/作爲分隔符,但隨後用在不同的地方/轉義。
  • 你正在逃避<>看似隨意。他們不應該逃脫。
  • 出於某種原因,你有一些流氓/ s圍繞<br/>
  • 的類名的div被指定爲正則表達式header2Center樣品HTML
  • 標題是在HTML mytitletitle在正則表達式

隨着所有這些修正,你得到:

preg_match('(<span class="SectionHeader">mytitle</span><br/><div class="Center">(.*)</div\></span\>)',$data,$t); 

如果你想匹配的特定標題mytitle的任何標題,只需更換與.*?