繁体   English   中英

PHP preg_match_all HTML日期带有斜杠错误

[英]php preg_match_all html dates with slashes error

我试图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。

我究竟做错了什么?
提前致谢

(快速浏览)是因为您要匹配:

Last Login: 11/14/2009

使用此正则表达式:

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

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

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

进行比赛

仅仅使用DOM解析器 ,然后根据DOM查找的结果执行正则表达式会更好吗? 它使更好的正则表达式...

编辑

另一个问题是您的HTML是:

... 40%'align ='right'class ='SmallDimmedText'> ...

align ='right'和class ='SmallDimmedText'之间没有空格的地方

但是,该部分的正则表达式为:

... 40%\\'align = \\'right \\'class = \\'SmallDimmedText \\'> ...

显示的地方有一个空格。

使用DOM解析器它可以为您节省因细微错误而引起的头痛。

只是让您了解使用简单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);

我至少看到两个问题:

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

有了这段代码,它似乎可以更好地工作:

$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)


注意我也用过:

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

我的第一个建议是尽量减少preg_match_all中的文本量,为什么不只在“>”和“ <”之间做呢? 其次,我最终会像这样编写正则表达式,不确定是否有帮助:

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

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

我同意Yacoby。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM