正则表达式获取php中锚标签InnerHTML的内容

时间:2010-08-10 09:42:57

标签: php regex

我需要在php中使用RegExp检索锚标记innerHTML。考虑我有一个像

这样的语法
   <div class="detailsGray"><span class="detailEmail"><a href="http://example.com"class="fontLink">examples@mail.com</a></span></div>

尝试通过

获取它
preg_match_all('/class=\"fontLink"\>.*\<\/a\>/', $raw, $matches);

但哪个不起作用。只有我需要使用RegExp和preg_match_all()检索examples@mail.com。谢谢

5 个答案:

答案 0 :(得分:3)

使用解析器。幸运的是,PHP有一个!

$html = '<div class="detailsGray"><span class="detailEmail"><a href="http://example.com" class="fontLink">examples@mail.com</a></span></div>';
echo retrieve_node_text($html, "//a[@class='fontLink']");

// -----------------------------------------------
function retrieve_node_text($html_fragment, $xpath) {
  $fragment = new DOMDocument();
  $fragment->loadHTML($html_fragment);

  if ($fragment) {
    $xp = new DOMXPath($fragment);
    $result = $xp->query($xpath);

    if ($result->length == 1) {
      return $result->item(0)->textContent;
    }
  }
  return FALSE;
}

返回:

examples@mail.com

答案 1 :(得分:2)

看看正则表达式有点混乱:

'/class=\"fontLink\">.*?<\/a>/'

据我所知,正则表达式<>没有什么特别之处。

你不希望.*,因为它将直接到行的末尾,然后开始向后工作。如果在.*?之前不匹配,</a>将采用下一个字符。

答案 2 :(得分:0)

您的意见是什么?如果它是来自网络的原始数据,则regexp不是一种可行的方法。将你的dom加载为树会更好。

答案 3 :(得分:0)

你需要积极的向前看和向后看,所以你的模式将是这样的:

(?<=class=\"fontLink\"\>).*(?=\<\/a\>)

答案 4 :(得分:0)

我认为你的方法已经足够好了。这是我的解决方案:

preg_match('/class=\"fontLink"\>(.*)\<\/a\>/', $raw, $matches);
$parsedEmail = $matches[1];

只需在您想要的部件上添加括号,这样它们就可以单独匹配。 如果您只想匹配一个问题,请使用preg_match()而不是preg_match_all()。