我试图在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。
我做错了什么?答案 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)
我至少看到两个问题:
'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+/?]+)#', ...