Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Помогите найти ошибку в регулярном выражении - тэги
 
 автор: antf   (11.05.2005 в 20:33)   письмо автору
 
 

Здравствуйте, пишу систему поиска по сайту и тут возникла такая проблема: мне нужно выбрать всю информацию, которая находится между тегами <td class='Content_TD'> и </form></td>
Написал регулярное выражение:
<?
   preg_match
("/\<td class\='Content_TD'\>(.+)\<\/form\>\<\/td>/"$Content$Matches); 
?>

Данная конструкция не работает. Помогите, пожалуйста, найти ошибку.
Заранее спасибо за ответ.

   
 
 автор: cheops   (11.05.2005 в 22:47)   письмо автору
 
   для: 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];
?>

   
 
 автор: Flash5   (11.05.2005 в 23:05)   письмо автору
 
   для: cheops   (11.05.2005 в 22:47)
 

А можно по точней, чем плоха конструкция .+ и .*? Я их часто использую, хотелось бы знать где ожидать подводный камень?

   
 
 автор: cheops   (11.05.2005 в 23:33)   письмо автору
 
   для: Flash5   (11.05.2005 в 23:05)
 

Они "жадные", т.е. если имеется конструкция
<td>...</td><td>...</td>

то конструкция
/<td>(.+)<\/td>/

вернёт
...</td><td>...

вместо
...

"Жадностью" конечно можно управлять при помощи модификаторов, но проблем всё-равно огрести можно, так как .+ и .* удовлетворяет ВСЁ и с ними трудно создать сложные регулярные выражения.

   
 
 автор: Flash5   (12.05.2005 в 00:05)   письмо автору
 
   для: cheops   (11.05.2005 в 23:33)
 

Другими словами, просто не рекомендуется пользоваться, как например не советуют пользоваться передачей параметров функции ссылкой хотя это допустимо и в некоторых случаях единственное подходящее решение! Я правильно вас понял?

   
 
 автор: antf   (12.05.2005 в 03:31)   письмо автору
 
   для: Flash5   (12.05.2005 в 00:05)
 

ммм... Между <td class='Content_TD'> и </form></td> может стоять куча различных тегов. Я использовал еще один способ - ничего не выходит
"/(?<=<td class='Content_TD'>)(.+)(?=<\/form>)/"

   
 
 автор: cheops   (12.05.2005 в 12:17)   письмо автору
 
   для: 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 регулярных выражениях проходят, где имеются модификаторы в других диалектах регулярных выражений их нет и управлять "жадностью" не получится.

   
 
 автор: antf   (12.05.2005 в 21:14)   письмо автору
 
   для: 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));
?>

   
 
 автор: Flash5   (12.05.2005 в 22:20)   письмо автору
 
   для: antf   (12.05.2005 в 21:14)
 

В вашем варианте надо добавить while цикл, так как возможно не одно совпадение :-)

   
 
 автор: antf   (13.05.2005 в 01:54)   письмо автору
 
   для: Flash5   (12.05.2005 в 22:20)
 

В моем случае - только одно, так как мне нужно выбрать колонку с основным содержанием сайта, а она как раз располагается внутри данной конструкции :)

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования