我使用以下代码:
<?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];
我很想弄清楚为什么这不起作用。任何帮助都是极好的。感谢。
答案 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)
/your-regex/s
$r_header
应该是/Prev\. Week(.+?)Next Week/s
<
和>
。答案 3 :(得分:2)
您想要添加s (PCRE_DOTALL)
修饰符。默认情况下,.
与换行符不匹配,我看到该页面在您查找的两个部分之间有它们。
旁注:虽然它们没有受到伤害(可读性除外),但您不需要在<
和>
之前使用反斜杠。
答案 4 :(得分:0)
我认为这是因为您将值应用于正则表达式,就好像它是纯文本一样。但是,这是HTML。例如,您的正则表达式应该被修改为解析:
<a href="...">Prev. Week</a> ...
不要解析常规纯文本,例如:“Prev.Week ....”