2010-03-11 43 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的任何标题,只需更换与.*?