php preg_match_all html日期与斜杠错误

时间:2009-12-02 23:46:18

标签: php

我试图在2个html标签之间使用斜杠preg_match_all一个日期;但它返回null。

这是html:

> <td width='40%' align='right'class='SmallDimmedText'>Last Login: 11/14/2009</td>

这是我的preg_match_all()代码

preg_match_all('/<td width=\'40%\' align=\'right\' class=\'SmallDimmedText\'>Last([a-zA-Z0-9\s\.\-\',]*)<\/td>/', $h, $table_content, PREG_PATTERN_ORDER);

其中$ h是上面的html。

我做错了什么?
提前谢谢

4 个答案:

答案 0 :(得分:3)

它(快速浏览一下)是因为你想要匹配:

Last Login: 11/14/2009

这个正则表达式:

Last([a-zA-Z0-9\s\.\-\',]*)

正则表达式不包含文本字符串中包含的:/所需的字符。将正则表达式的必需部分更改为:

Last([a-zA-Z0-9\s\.\-\',:/]*)

给出一个匹配

简单地使用DOM parser,然后在DOM查找结果上执行正则表达式会更好吗?这样可以获得更好的正则表达式......

修改

另一个问题是你的HTML是:

... 40%'align ='right'class ='SmallDimmedText'&gt; ...

在align ='right'和class ='SmallDimmedText'

之间没有空格

但是你对该部分的正则表达式是:

... 40%\'align = \'right \'class = \'SmallDimmedText \'&gt; ...

如果显示有空格。

使用DOM解析器它可以为您节省更多因为细微错误而导致的麻烦。

只是为了让您了解使用Simple HTML DOM解析它是多么简单。

$html = str_get_html(...);
$elems = $html->find('.SmallDimmedText');
if ( count($elems->children()) != 1 ){
    throw new Exception('Too many/few elements found');
}
$text = $elems->children(0)->plaintext;

//parsing here is only an example, but you have removed all
//the html so that any regex used is really simple.
$date = substr($text, strlen('Last Login: '));
$unixTime = strtotime($date);

答案 1 :(得分:1)

我至少看到两个问题:

    在您的HTML字符串中
  • 'right'class=之间没有空格,而且正则表达式中有一个空格
  • 您必须在[]之间的匹配字符列表中添加至少这3个字符:
    • ':'(“登录”和日期之间有一个
    • ''(“Last”和“Login”之间以及“:”和日期之间有空格
    • 和'/'(日期部分之间)

使用此代码,它似乎更好用:

$h = "<td width='40%' align='right'class='SmallDimmedText'>Last Login: 11/14/2009</td>";
if (preg_match_all("#<td width='40%' align='right'class='SmallDimmedText'>Last([a-zA-Z0-9\s\.\-',: /]*)<\/td>#", 
        $h, $table_content, PREG_PATTERN_ORDER)) {
    var_dump($table_content);
}

我得到了这个输出:

array
  0 => 
    array
      0 => string '<td width='40%' align='right'class='SmallDimmedText'>Last Login: 11/14/2009</td>' (length=80)
  1 => 
    array
      0 => string ' Login: 11/14/2009' (length=18)


注意我也使用过:

  • #作为正则表达式分隔符,以避免必须转义斜杠
  • "作为字符串分隔符,以避免必须转义单引号

答案 2 :(得分:1)

我的第一个建议是尽量减少preg_match_all中的文本数量,为什么不在“&gt;”之间进行操作。和“&lt;”?其次,我最终会像这样编写正则表达式,不确定它是否有帮助:

/>.*[0-9]{1,2}/[0-9]{1,2}/[0-9]{2,4}</

那将查找一个标签的结尾,然后是任何字符,然后是日期,然后是另一个标签的开头。

答案 3 :(得分:1)

我同意Yacoby的意见。

至少,删除对任何HTML特定的所有引用,并简单地制作正则表达式

preg_match_all('#Last Login: ([\d+/?]+)#', ...