0

我想把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];
4

4 回答 4

1

采用

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

因此,您的匹配器将首先停止 <<">> ([^"] 表示除 ") 之外的任何内容

或者

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

更准确地说,使用仅包含您需要捕获的内容的组。(注意“被排除在外)

于 2012-07-31T15:14:16.623 回答
0

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

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

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

在此处查看实际操作:http: //viper-7.com/qZu9tj

于 2012-07-31T15:13:22.083 回答
0

尝试这种方式而不是正则表达式:

$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;

正则表达式处理这类事情可能会很痛苦。最好使用解析器。

于 2012-07-31T15:48:11.830 回答
0

最好的方法是使用 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>受不了就晚了。

于 2012-07-31T17:39:33.153 回答