据推测,有效的正则表达式不会返回PHP中的任何数据

时间:2008-10-21 20:01:40

标签: php regex

我使用以下代码:

<?php
$stock = $_GET[s]; //returns stock ticker symbol eg GOOG or YHOO
$first = $stock[0];

$url = "http://biz.yahoo.com/research/earncal/".$first."/".$stock.".html";
$data = file_get_contents($url);

$r_header = '/Prev. Week(.+?)Next Week/';
$r_date = '/\<b\>(.+?)\<\/b\>/';

preg_match($r_header,$data,$header);
preg_match($r_date, $header[1], $date);

echo $date[1];
?>

我检查了正则表达式here,它们似乎有效。如果我只检查$ url或$ data它们是正确的,如果我打印$ data并检查源代码,我正在寻找在正则表达式中使用的代码。如果您对检查任何内容感兴趣,可以使用http://biz.yahoo.com/research/earncal/g/goog.html

作为正确网址的示例

我已经尝试了我能想到的一切,包括var_dump($ header)和var_dump($ date),两者都返回空数组。

我已经能够创建其他有效的正则表达式。例如,以下内容正确返回“收入”:

$r_header = '/Company (.+?) Calendar/';
preg_match($r_header,$data,$header);
echo $header[1];

我很想弄清楚为什么这不起作用。任何帮助都是极好的。感谢。

5 个答案:

答案 0 :(得分:4)

您的正则表达式不允许HTML尝试中的换行符:

$r_header = '/Prev\. Week((?s:.*))Next Week/';

s告诉它与.中的换行符匹配(匹配任何)。

答案 1 :(得分:3)

问题是HTML中有换行符,您需要将其与s正则表达式修饰符合并,如下所示

<?php
$stock = "goog";//$_GET[s]; //returns stock ticker symbol eg GOOG or YHOO
$first = $stock[0];

$url = "http://biz.yahoo.com/research/earncal/".$first."/".$stock.".html";
$data = file_get_contents($url);

$r_header = '/Prev. Week(.+?)Next Week/s';
$r_date = '/\<b\>(.+?)\<\/b\>/s';


preg_match($r_header,$data,$header);
preg_match($r_date, $header[1], $date);

var_dump($header);
?>

答案 2 :(得分:2)

  1. 默认情况下,Dot与新行不匹配。使用/your-regex/s
  2. $r_header应该是/Prev\. Week(.+?)Next Week/s
  3. 仅供参考:您无需在正则表达式中转义<>

答案 3 :(得分:2)

您想要添加s (PCRE_DOTALL)修饰符。默认情况下,.与换行符不匹配,我看到该页面在您查找的两个部分之间有它们。

旁注:虽然它们没有受到伤害(可读性除外),但您不需要在<>之前使用反斜杠。

答案 4 :(得分:0)

我认为这是因为您将值应用于正则表达式,就好像它是纯文本一样。但是,这是HTML。例如,您的正则表达式应该被修改为解析:

<a href="...">Prev. Week</a> ...

不要解析常规纯文本,例如:“Prev.Week ....”