【问题标题】:retrieving the title of a remote page检索远程页面的标题
【发布时间】:2011-10-17 07:33:34
【问题描述】:

我对检索远程页面标题的模式有一点问题,而相同的模式给出的结果是这里的示例。

preg_match_all('|<title>(.*)</title>|U',$this->data,$title);

用于其他 url 并给出结果。 以下返回空数组

preg_match_all('|<title>(.*)</title>|U', $valD, $title);

谁能告诉我这些行有什么问题。

其中 $this->data 和 $valD 保存了不同服务器的两个不同 url 的内容。

请帮助我。我试图解决它,但我没有解决它。 所以我要求你们都告诉我我在这方面的错误。

谢谢。

【问题讨论】:

  • 看看this question。使用 HTML 解析器将文档转换为 DOM,然后使用 DOM 遍历方法或 XPath。
  • 您是否将$title 初始化为一个空数组?您是否打开了错误报告 (error_reporting(E_ALL | E_NOTICE))?
  • 问题一定是您的正则表达式与一个站点不匹配 - 您能否发布不匹配的 HTML 的 sn-p,其中包含该页面的 标记?跨度>
  • 用正则表达式解析 HTML 很脆弱。除非您对远程页面有绝对控制权并且仅对不能递归嵌套的元素,否则不要这样做。

标签: php html regex


【解决方案1】:

如果您正在匹配 HTML,那么您还应该期待大写标签。因此添加|i 标志。

标题标签也可能包含换行符,这就是为什么|s 标志也应该出现的原因。

 preg_match_all('|<title>(.*)</title>|Uis', ...

【讨论】:

  • 如果有人这样做了怎么办:stuff
  • @nalply:根本不匹配。
  • 另外,使用| 作为正则表达式分隔符也不是一个好主意。最好使用不是正则表达式元字符的字符。 %...%~...~ 浮现在脑海中。
  • @mario,当然,这就是为什么正则表达式很脆弱的一个例子 :-)
【解决方案2】:

可能标题标签中有一个换行符,如下所示:

<title>
The page title
</title>

试试

preg_match_all('|<title>[:space:]*(.*)[:space:]*</title>|U', $valD, $title);

改为。

【讨论】:

  • 如果有人用 而不是 <title> 怎么办? :-)
猜你喜欢
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 2010-09-08
  • 2012-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多