Предположительно правильное регулярное выражение не возвращает никаких данных в PHP - PullRequest
1 голос
/ 22 октября 2008

Я использую следующий код:

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

Я проверил регулярные выражения здесь , и они кажутся действительными. Если я проверяю только $ url или $ data, они получаются правильно, и если я печатаю $ data и проверяю источник, то код, который я ищу для использования в регулярном выражении, находится там. Если вы заинтересованы в проверке чего-либо, пример правильного URL будет 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 ]

4 голосов
/ 22 октября 2008

Ваше регулярное выражение не допускает разрывов строк в HTML. Попробуйте:

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

s указывает, чтобы он соответствовал символам новой строки в . (соответствует любому).

3 голосов
/ 22 октября 2008

Проблема в том, что в HTML есть новые строки, которые нужно включить в модификатор s regex, как показано ниже

<?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 голосов
/ 22 октября 2008

Вы хотите добавить модификатор s (PCRE_DOTALL). По умолчанию . не соответствует символу новой строки, и я вижу, что на странице они есть между двумя частями, которые вы ищете.

Примечание: хотя они и не повреждают (кроме читабельности), вам не нужна обратная косая черта до < и >.

2 голосов
/ 22 октября 2008
  1. Точка не соответствует символам новой строки по умолчанию. Используйте /your-regex/s
  2. $r_header должно быть /Prev\. Week(.+?)Next Week/s
  3. К вашему сведению: вам не нужно бежать < и > в регулярном выражении.
0 голосов
/ 22 октября 2008

Я думаю, это потому, что вы применяете значения к регулярному выражению, как будто это обычный текст. Тем не менее, это HTML. Например, ваше регулярное выражение должно быть изменено для анализа:

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

Не анализировать обычный текст, например: «Предыдущая неделя ....»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...