修改正则表达式以匹配时间


Modification to regex to match time

我想从中取出2012-07-16T21:00:00

 <abbr title="2012-07-16T21:00:00" class="dtstart">Monday, July 16th, 2012</abbr>

但我遇到了一些困难。这就是我所做的

preg_match('/<abbr title="(.*)" '/>/i', $file_string, $time);
$time_out = $time[1];

使用

preg_match('/<abbr title="([^"]*)" '/>/i', $file_string, $time);

所以你的对手会在第一个<lt;">>([^"]的意思不是")

preg_match('/<abbr title="([0-9T:-]*)" '/>/i', $file_string, $time);

更确切地说,使用只包含需要捕获的内容的组。(注意"已排除")

虽然我不认为使用正则表达式是最好的方法,但在某些情况下可能还可以。

如果你使用的是正则表达式,这就是你需要的:

preg_match('/<abbr title="([^"]*)"/i', $file_string, $time);

请参阅此处的操作:http://viper-7.com/qZu9tj

用这种方式代替regex:

$dom = new DOMDocument;
$dom->loadXML($file_string);
$abbr = simplexml_import_dom($dom);
$time;
foreach ($abbr[0]->attributes() as $key => $value)
{
    if ($key == 'title')
    {
        $time = $value;
        break;
    }
}
echo $time;

Regex可能是处理这种事情的痛苦。最好使用解析器。

最好的方法是使用HTML解析器,如PHP的DOM

<?php
    $html = <<<HTML
<abbr title="2012-07-16T21:00:00" class="dtstart">Monday, July 16th, 2012</abbr>
HTML;
    $dom = new DOMDocument();
    $dom->loadHTML($html);
    $abbr  = $dom->getElementsByTagName("abbr")->item(0);
    $title = $abbr->getAttribute("title");
    echo $title;

即使你的数据看起来不完全一样,这也会起作用:

  • 如果在title之前或之后还有其他属性
  • 如果有尾随空格或其他不可见字符
  • 不考虑报价类型("'或无)

所以,请不要使用RegEx,因为它最终会导致你对cuthulu失去理智。<center>无法保持,为时已晚。