HTML标记上的简单正则表达式


Simple Regular Expression on HTML Tags

问题一:

</a>              
19-10-2011, 04:49 PM
             </td> <td class="thread" 

如何获取日期和时间,即2011年10月19日下午04:49

注意:如上所述,上述片段可能具有不稳定的间距,例如</td> <td class

我的尝试:

preg_match("#</a>(.*?)</td> <td class='"thread'"#", $page, $fetchContent);

结果:


问题二:

<div id="post_message_43345">ANY TYPE OF CONTENT INCLUDING SPACES</tr> <tr>

我需要获取"任何类型的内容"

注意:标记(如</tr> <tr>)之间的间距可能因页面而异。

我的尝试:

preg_match("#<div id='"post_message_[a-zA-Z0-9_]*'">(.*?)</tr> <tr>#", $page, $fetchedContent);

结果:

我正在为一项任务寻找粗略的临时短片。因此,我没有使用HTML解析器

任何帮助都将不胜感激。

问题1

您需要使用s标志使.也与换行符匹配:

preg_match("#</a>(.*?)</td> <td class='"thread'"#s", $page, $fetchContent);

不过,你最好直接匹配日期:

preg_match("#([0123]?[0-9]-(?:0?[1-9]|1[012])-(?:[0-9]{4})),? ?((?:0[0-9]|1[012]):[0-5][0-9] ?[AP]M)#",...)

编辑-此日期正则表达式将稍快(两边都添加了边界):

preg_match("#''b([0123]?[0-9]-(?:0?[1-9]|1[012])-(?:[0-9]{4}))[, ]{1,3}((?:0[0-9]|1[012]):[0-5][0-9] ?[AP]M)''b#",...)

对于这两种情况,日期都以$results[1]表示,时间则以$results[2]表示。

问题2

再次使用s标志,并且为了在</tr> <tr>之间具有变化的空间,使用*

preg_match("#<div id='"post_message_[a-zA-Z0-9_]*'">(.*?)</tr> *<tr>#s", $page, $fetchedContent);

如果您想在</tr><tr>之间允许换行,请改为使用's*。问题1也是如此。

注意:上面的片段可能有不稳定的间距,正如你在上面看到的那样

您希望它也与换行符相匹配。.通常不会这样做。这基本上需要#s修饰符:

  preg_match('#</a>(.*?)</td> <td class="thread"#s', ...

但您也可以在(.*?)捕获组周围添加两次's*。也在CCD_ 18和CCD_。

然后,您可以使正则表达式更具体地'd'd-'d'd-'d'd, 'd'd:'d'd,只捕获日期。这可能会使匹配标签变得有些多余。

注意:标签之间的间距可能因页面而异。

您可以再次使用's*,它在任何组合中匹配空格和换行符。