[英]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);
我至少看到两个问题:
'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.