PHP正则表达式:可选地匹配整个单词

4

我正在使用PHP,需要从一些CURL响应中抓取信息。我模拟了浏览器的ajax请求和普通(整个)页面请求,但是在HTML的这个部分中,ajax响应与整个页面请求稍有不同。

ajax响应如下: <div id="accountProfile"><h2>我想要的部分</h2><dl id="accountProfileData">

然而,正常响应为: <div id="accountProfile"><html xmlns="http://www.w3.org/1999/xhtml"><h2>我想要的部分</h2><dl id="accountProfileData">

即ajax响应中缺少标签:<html xmlns="http://www.w3.org/1999/xhtml">。我需要获取h2标签之间的内容。显然,我不能只从页面中抓取<h2>我想要的部分</h2><dl id="accountProfileData">,因为这些标签可能出现在其他地方,并且不包含我想要的信息。

我可以单独匹配其中一个模式,但我希望在单个正则表达式中同时匹配两个模式。以下是我的解决方案,用于匹配ajax响应:

<?php
$pattern = '/\<div id="accountProfile"\>\<h2\>(.+?)\<\/h2\>\<dl id="accountProfileData"\>/';
preg_match($pattern, $haystack, $matches);
print_r($matches);
?>

有人能向我展示如何修改模式,以便可选择地匹配<html xmlns="http://www.w3.org/1999/xhtml">标签吗?如果为了简洁起见需要简化干草堆,那就没问题。


正常的响应已经出现问题了 - html 元素在文档中没有位置。我不太确定你的问题是什么?你考虑过使用 DOM 解析器来解析 HTML 吗?请参阅 解析 HTML 的最佳方法 - Pekka
它可能有缺陷,但它仍然存在。我没有编写我正在抓取的网站。好的,我稍微更新了要求。 - mulllhausen
1个回答

2
我还没有测试过,但你可以尝试这个方法:
    $pattern = '/\<div id="accountProfile"\>(\<html xmlns=\"http://www.w3.org/1999/xhtml\"\>){0,1}\<h2\>(.+?)\<\/h2\>\<dl id="accountProfileData"\>/';

只要您在 xmlns=\"http://www.w3.org/1999/xhtml 中转义所有内容,那么这将起作用 :) 另外,您可以将 {0,1} 简化为 ? - mulllhausen
我在想是否有可能在html xmlns=...标签周围不使用括号来编写模式?这并不是什么大问题,但是PHP的preg_match会为任何匹配括号中模式的内容创建一个新的数组元素。当然,我可以只使用最终的$matches数组元素,但我很好奇是否有可能避免匹配这个不需要的html xmlns=...标签模式。 - mulllhausen
@mulllhausen:您可以通过在非捕获组的开头添加“?:”来使用非捕获组,因此:(?:\<html ...). - porges

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接