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

时间:2012-01-19 03:56:36

标签: php regex

问题一:

</a>              

19-10-2011, 04:49 PM

             </td> <td class="thread" 

如何获取日期和时间,即19-10-2011,04:49 PM

注意:如上所示,上面的代码段可能会有不稳定的间距,例如</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解析器。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

  

注意:如上所示,上面的代码段可能有不稳定的间距

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

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

但您也可以在\s*捕获组周围添加(.*?)两次。也在</td><td之间。

然后你可以让你的正则表达式更具体\d\d-\d\d-\d\d, \d\d:\d\d来捕捉日期。这可能会使标签的匹配变得多余。

  

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

您可以再次使用\s*来匹配任意组合的空格和换行符。

答案 1 :(得分:1)

问题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也是如此。