【问题标题】:php regex optionally match a whole wordphp regex 可选地匹配整个单词
【发布时间】:2011-05-10 07:36:35
【问题描述】:

我正在使用 php,我需要从一些 curl 对网站的响应中抓取一些信息。我正在模拟浏览器的 ajax 请求和浏览器的普通(整个)页面请求,但是 ajax 响应与 html 的这一部分中的整个页面请求略有不同。

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);
?>

谁能告诉我我应该如何改变模式以选择性地匹配&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt; 标签?如果为了简洁起见有助于简化干草堆,那很好。

【问题讨论】:

  • 正常响应被破坏 - html 元素在文档中没有位置。我不完全确定你的问题是什么?您是否考虑过使用 DOM 解析器来解析 HTML?见Best methods to parse HTML
  • 它可能已经坏了,但它仍然存在。我没有写我正在抓取的网站。好的,我稍微更新了要求

标签: php regex preg-match


【解决方案1】:

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

    $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}简化为?
  • 我想知道是否可以在html xmlns=... 标签周围写出不带括号的模式?这没什么大不了的,但是 php 的 preg_match 为任何匹配括号中的模式的东西创建了一个新的数组元素。当然我可以只使用最终的$matches 数组元素,但我很好奇它是否可以避免匹配这个不需要的html xmlns=... 标记模式。
  • @mulllhausen:您可以通过在开头添加?: 来使用非捕获组,因此:(?:\&lt;html ...)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-18
相关资源
最近更新 更多