preg_replace地狱

时间:2010-03-11 19:45:52

标签: php 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>

事件名称是我想在函数中返回的数据。

非常感谢,这对屁股很痛苦。

2 个答案:

答案 0 :(得分:0)

虽然我倾向于同意评论者的说法,这不是一个漂亮的解决方案,但这是我对你的陈述的未经测试的修订:

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

我将双引号字符串更改为单引号,因为您没有使用双引号字符串的任何变量替换功能,这避免了必须使用反斜杠转义双引号以及避免任何歧义反斜杠(可能应该加倍以产生正确的字符串 - 请参阅the php manual on strings)。我将斜杠/分隔符更改为哈希#,因为匹配模式中出现的斜杠数量(其中一些在您的版本中没有反斜杠转义)。

答案 1 :(得分:0)

你的表达有很多不妥之处:

  • 您使用/作为分隔符,但在各个地方使用/未转义。
  • 您正在随意逃离<>。它们不应该被逃脱。
  • 由于某种原因,/周围有一些流氓<br/>
  • div的类名在正则表达式中指定为header2,但在示例HTML中指定为Center
  • 标题为HTML中的mytitle和正则表达式中的title

所有这些都得到了纠正,你得到:

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

如果您想匹配任何标题而不是特定标题mytitle,只需将其替换为.*?