我需要在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。谢谢
答案 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()。