2011-05-10 92 views
4

即时通讯使用PHP和我需要刮一些信息从一些卷曲响应到一个网站。我模拟浏览器的ajax请求和浏览器的正常(全部)页面请求,但是ajax响应与本节html中的整个页面请求略有不同。PHP正则表达式可选地匹配整个词

Ajax响应是: <div id="accountProfile"><h2>THIS IS THE BIT I WANT</h2><dl id="accountProfileData">

但是正常的反应是: <div id="accountProfile"><html xmlns="http://www.w3.org/1999/xhtml"><h2>THIS IS THE BIT I WANT</h2><dl id="accountProfileData">

即Ajax响应缺少标签:<html xmlns="http://www.w3.org/1999/xhtml">。我需要获取h2标签之间的位。显然我不能只是刮<h2>THIS IS THE BIT I WANT</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">标签藏汉模式?如果它有助于简化干草堆的简洁的目的,那很好。

+0

正常响应被打破 - 一个'html'元素具有文档中没有位置。我不完全确定你的问题是什么?你有没有考虑过使用DOM解析器来解析HTML?请参见[解析HTML的最佳方法](http://stackoverflow.com/questions/3577641/3577662#3577662) – 2011-05-10 07:38:15

+0

它可能是坏的,但它在那里都一样。我没有写我刮的网站。好的,我更新了需求 – mulllhausen 2011-05-10 07:39:28

回答

2

我没有测试它,但你可以试试这个:

$pattern = '/\<div id="accountProfile"\>(\<html xmlns=\"http://www.w3.org/1999/xhtml\"\>){0,1}\<h2\>(.+?)\<\/h2\>\<dl id="accountProfileData"\>/'; 
+0

,它可以工作 - 只要你在'xmlns = \“http:// www.w3.org/1999/xhtml' :)中逃避一切,你也可以简化'{0,1}' ''' – mulllhausen 2011-05-10 07:58:35

+0

是的 - 我很高兴它的工作原理 – 2011-05-10 08:01:03

+0

我想知道是否可以在'html xmlns = ...'标签中没有括号的情况下编写模式?它没什么大不了的,但是php的preg_match创建了一个新的数组元素用于匹配括号中的模式的任何内容当然,我可以使用最后的'$ matches'数组元素,但是我好奇它是否可能避免匹配这种不需要的'html xmlns = ...'标记模式 – mulllhausen 2011-05-12 04:08:57