【问题标题】:parsing information within HTML tags avoiding title value解析 HTML 标签中的信息,避免标题值
【发布时间】:2013-11-10 11:49:21
【问题描述】:

我正在尝试解析 HTML 标记之间的信息。使用正则表达式,我怎样才能避免标题值,因为它们是不同的,只解析标签内的信息?

HTML 代码:

<p class=period>
<abbr class=dtstart title=2010>2010</abbr>
<abbr class=dtend title=2012>2012</abbr> 
</p>

输出应该类似于:2010, 2012

如果title=2010,我正在使用这种方法并且它工作正常:

$experience .= "<c:start_date>". trim($this->parse_text($tmp3[$i], "<abbr class=\"dtstart\" title=\"2010\">", "</abbr>"))."</c:start_date>\r\n";

我试过这个:title=\"(.*)\" 但它不起作用!关于我应该改用哪个正则表达式的任何建议?

非常感谢

【问题讨论】:

  • parse_text() 是如何定义的?
  • 正则表达式为title=(\d+)
  • parse_text 函数:function parse_text($str, $start, $end) { if(empty($str)) { return; } $pos_start = strpos($str, $start); $pos_end = strpos($str, $end, ($pos_start + strlen($start))); if ( ($pos_start !== false) &amp;&amp; ($pos_end !== false) ) { $pos1 = $pos_start + strlen($start); $pos2 = $pos_end - $pos1; return substr($str, $pos1, $pos2); } else return; }
  • 值得注意的是parse_text()函数中没有使用正则表达式...

标签: php regex


【解决方案1】:

正则表达式不是为 HTML 解析而设计的。你最好使用 DOM/XPath:

$html = <<<HTML
<p class=period>
<abbr class=dtstart title=2010>2010</abbr>
<abbr class=dtend title=2012>2012</abbr> 
</p>
HTML;
$dom = new DOMDocument;
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$dtstart = $xpath->query("//abbr[contains(@class, 'dtstart')]")->item(0)->nodeValue;
$dtend = $xpath->query("//abbr[contains(@class, 'dtend')]")->item(0)->nodeValue;

在一个数组中同时获取dtstartdtend...

$dates = $xpath->query("//abbr[contains(@class, 'dtstart') or contains(@class, 'dtend')]");
list($dtstart, $dtend) = array_map(function ($node) {
    return $node->nodeValue;
}, iterator_to_array($dates));

【讨论】:

    猜你喜欢
    • 2012-04-02
    • 1970-01-01
    • 1970-01-01
    • 2014-11-28
    • 1970-01-01
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    相关资源
    最近更新 更多