|
|
|
| Здравствуйте, пишу систему поиска по сайту и тут возникла такая проблема: мне нужно выбрать всю информацию, которая находится между тегами <td class='Content_TD'> и </form></td>
Написал регулярное выражение:
<?
preg_match("/\<td class\='Content_TD'\>(.+)\<\/form\>\<\/td>/", $Content, $Matches);
?>
|
Данная конструкция не работает. Помогите, пожалуйста, найти ошибку.
Заранее спасибо за ответ. | |
|
|
|
|
|
|
|
для: antf
(11.05.2005 в 20:33)
| | А нет, экранировать символы < и = не нужно, кроме того, всегда следует избегать конструкций .+ и .* - с ними ничего путного не получится. Лучше написать что-то вроде
<?php
$Content = "<td class='Content_TD'> и dfds dsfds d fd </form></td>";
preg_match("/<td class='Content_TD'>([^<]+)\<\/form><\/td>/", $Content, $Matches);
echo $Matches[1];
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(11.05.2005 в 22:47)
| | А можно по точней, чем плоха конструкция .+ и .*? Я их часто использую, хотелось бы знать где ожидать подводный камень? | |
|
|
|
|
|
|
|
для: Flash5
(11.05.2005 в 23:05)
| | Они "жадные", т.е. если имеется конструкция
то конструкция
вернёт
вместо
"Жадностью" конечно можно управлять при помощи модификаторов, но проблем всё-равно огрести можно, так как .+ и .* удовлетворяет ВСЁ и с ними трудно создать сложные регулярные выражения. | |
|
|
|
|
|
|
|
для: cheops
(11.05.2005 в 23:33)
| | Другими словами, просто не рекомендуется пользоваться, как например не советуют пользоваться передачей параметров функции ссылкой хотя это допустимо и в некоторых случаях единственное подходящее решение! Я правильно вас понял? | |
|
|
|
|
|
|
|
для: Flash5
(12.05.2005 в 00:05)
| | ммм... Между <td class='Content_TD'> и </form></td> может стоять куча различных тегов. Я использовал еще один способ - ничего не выходит
"/(?<=<td class='Content_TD'>)(.+)(?=<\/form>)/"
|
| |
|
|
|
|
|
|
|
для: antf
(12.05.2005 в 03:31)
| | Не очень понятно со знаками вопроса - они к какому символу относятся?
Если между тэгами находятся другие тэги и ничего кроме .+ использовать нельзя, тогда следует инвертировать "жадность" и сделать поиск "нежадным".
<?php
$Content = "<td class='Content_TD'> и dfds <b>dsfds</b> d fd </form></td><td class='Content_TD'> и dfds dsfds d fd </form></td>";
preg_match("/<td class='Content_TD'>(.+)\<\/form><\/td>/U", $Content, $Matches);
echo $Matches[1];
?>
|
Не рекомендуется .+ так как такие финты, только в Perl регулярных выражениях проходят, где имеются модификаторы в других диалектах регулярных выражений их нет и управлять "жадностью" не получится. | |
|
|
|
|
|
|
|
для: cheops
(12.05.2005 в 12:17)
| | Вообще-то задачу можно решить при помощи substr() и strpos(), однако регулярное выражение тоже интересно составить. Мое решение:
<?
$Content = file_get_contents("http://{$SERVER_NAME}/index.php?page={$key}");
$Begin = strpos($Content, "<td class='Content_TD'>");
$End = strpos($Content, "</form></td>");
// +23 - длина строки <td class='Content_TD'>
$Begin = $Begin + 23;
$Tmp = substr($Content, $Begin, ($End - $Begin));
?>
|
| |
|
|
|
|
|
|
|
для: antf
(12.05.2005 в 21:14)
| | В вашем варианте надо добавить while цикл, так как возможно не одно совпадение :-) | |
|
|
|
|
|
|
|
для: Flash5
(12.05.2005 в 22:20)
| | В моем случае - только одно, так как мне нужно выбрать колонку с основным содержанием сайта, а она как раз располагается внутри данной конструкции :) | |
|
|
|