在php中获取锚定标记InnerHTML内容的正则表达式

在php中获取锚定标记InnerHTML内容的正则表达式,php,regex,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=\"

我需要在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);
preg\u match\u all('/class=\“fontLink”\>.\/',$raw,$matches);

但这是行不通的。只有我需要找回examples@mail.com使用RegExp和preg_match_all()。谢谢看正则表达式有点乱:

”/class=\“fontLink\”>.*?/“

据我所知,regex中的
没有什么特别之处


您不需要
*
,因为这将直接到达行的末尾,然后开始向后工作
*?
将采用下一个字符,如果不匹配,直到

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

”/class=\“fontLink\”>.*?/“

据我所知,regex中的
没有什么特别之处


您不需要
*
,因为这将直接到达行的末尾,然后开始向后工作<如果在

之前不匹配,code>*?将使用下一个字符,您的输入是什么?如果是来自web的原始数据,则regexp不是一种可靠的方法。最好将dom作为树加载。

您的输入是什么?如果是来自web的原始数据,则regexp不是一种可靠的方法。最好以树的形式加载dom。

您需要正向的向前看和向后看,因此您的模式如下:

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

您需要积极的向前看和向后看,因此您的模式如下:

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

使用解析器。幸运的是,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;
}

使用解析器。幸运的是,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;
}

我认为你的方法很好。这是我的解决方案:

preg_match('/class=\"fontLink"\>(.*)\<\/a\>/', $raw, $matches);
$parsedEmail = $matches[1];
preg\u match('/class=\“fontLink”\>(.*)\/',$raw,$matches);
$parsedEmail=$matches[1];
只需在所需零件上添加括号,即可单独匹配。
如果您只想匹配一个问题,请使用preg_match()而不是preg_match_all()。

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

preg_match('/class=\"fontLink"\>(.*)\<\/a\>/', $raw, $matches);
$parsedEmail = $matches[1];
preg\u match('/class=\“fontLink”\>(.*)\/',$raw,$matches);
$parsedEmail=$matches[1];
只需在所需零件上添加括号,即可单独匹配。
如果您只想匹配一个问题,请使用preg_match()而不是preg_match_all()。

您真的需要使用PHP吗?因为如果可以的话,您可以使用JQuery或简单的javascript来获得您想要的。例如,如果要检索锚标记,只需使用$('.fontlink').attr('href')。。只是一个建议。谢谢你的建议。但是,不幸的是,我需要使用php。你真的需要使用php吗?因为如果可以的话,您可以使用JQuery或简单的javascript来获得您想要的。例如,如果要检索锚标记,只需使用$('.fontlink').attr('href')。。只是一个建议。谢谢你的建议。但是,不幸的是,我需要使用php。可能重复@Ajith:不要忘记在代码中加入一些错误检查和处理。不能保证
loadHTML()
query()
运行成功,因为
$html\u fragment
$xpath
都可能被破坏。请确保使用中断的输入进行测试,并相应地处理PHP错误或警告。@Ajith:不要忘记在代码中加入一些错误检查和处理。不能保证
loadHTML()
query()
运行成功,因为
$html\u fragment
$xpath
都可能被破坏。请确保使用中断的输入进行测试,并相应地处理PHP错误或警告。