Посоветуйте простое регулярное выражение

Здравствуйте!

Ситуация такова:
1) есть переменная $get_page, содержащая исходный код страницы сайта.
2) в данном коде регулярно повторяются ссылки с такой структурой (меняется только текст ссылок):
<h3 class="t_i_h3">
<a title="Продаю BMW 735i в Ростове-на-Дону" href="/rostov-na-donu/avtomobili_s_probegom/prodayu_bmw_735i_89296613" name="89296613"> Продаю BMW 735i</a>
</h3>


Вопрос.
Какое регулярное выражение для php функции preg_match_all("", $get_page, $result) нужно написать, чтобы в $result массиве содержались все ссылки с такой структурой со страницы?
Спасибо за помощь!

P.S. На всякий случай — у <h3 class="t_i_h3"> всегда этот класс, меняется содержимое title, href, name, ну и текст самой ссылки, очевидно.
  • Вопрос задан
  • 4214 просмотров
Решения вопроса 1
light204
@light204 Автор вопроса
Хм, нашел у вас правильный пример (по мнению сайта regexp.ru). Хочу у себя проверить. Что делаю не так, как думаете?

Тестовый скрипт:

$get_page = file_get_contents('http://www.avito.ru/rostov-na-donu/avtomobili_s_probegom'); preg_match_all("|<h3\s+class=\«t_i_h3\»>(.+?)|isU", $get_page,$result); echo '<br/><strong>Результат:</strong> <pre>'.var_export($result[1],true).'</pre>';

Выдает пустой массив…
Ответ написан
Пригласить эксперта
Ответы на вопрос 6
avalak
@avalak
А я предлагаю забыть про регулярки (в данном случае) и использовать более подходящий и удобный инструмент.
PHP Simple HTML DOM Parser
<?php

require('simple_html_dom.php');

// Create DOM from string
$html = str_get_html('<html><body><h3 class="t_i_h3">
<a title="Продаю BMW 735i в Ростове-на-Дону" href="/rostov-na-donu/avtomobili_s_probegom/prodayu_bmw_735i_89296613" name="89296613"> Продаю BMW 735i</a>
</h3></body></html>');

// Find all links
foreach($html->find('h3.t_i_h3 a') as $element)
	echo $element->title;

Ответ написан
Комментировать
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
|<h3\s+class=\«t_i_h3\»>(.+?)|isU

Как-то так. А вообще использовали бы XPath И не мучались. Парсить DOM регулярками не всегд удобно.
Ответ написан
Комментировать
HighQuality
@HighQuality
☁ Ниндзя девелопер
'/<h3 class="t_i_h3"><a title="([0-9a-zA-Z-_\/]+)" href="([0-9a-zA-Z-_\/]+)" name="([0-9a-zA-Z-_\/]+)">([0-9a-zA-Z-_\/]+)<\/a><\/h3>/'

Это вообще не вариант, но за то годный. Знать на знаю как заставить искать не только a-zA-Z, но еще и а-яА-Я.
Пускай оно длинное и противное, но рабочее. :)
Ответ написан
CodeByZen
@CodeByZen
php, js, my/mssql, sqlite, html, css, it-consult
preg_match_all("/<h3 class=\"t_i_h3\">(.*)<\/h3>/isU",$get_page,result);
Ответ написан
@max_rip
regexr.com?32s0a
На выходе три переменных title href и содержимое текста +)
Ответ написан
Комментировать
@softm
<?php
   
  for($get_page ="",$i=0;$i<10;$i++)
    
     $get_page  .= "                                                                                                                              
     <h3 class=\"t_i_h3\">                                                                                                                        
     <a title=\"".md5(mt_rand(1,1000))."\" href=\"".md5(mt_rand(1,1000))."\" name=\"".md5(mt_rand(1,1000))."\"> ".md5(mt_rand(1,1000))."</a>      
     </h3>                                                                                                                                        
                                                                                                                                                  
     " . md5(mt_rand(1,1000));

     preg_match_all("~".
     

     "\s*".
     "\s*<h3.*?t_i_h3.?>".
     "\s*<a\s*title\=\"(.*?)\"\s*href\=\"(.*?)\"\s*name\=\"(.*?)\"\s*>(.*?)</a>".
     "\s*</h3>".
     "\s*".
     "\s*".
     
     
     "~msi", $get_page, $result, PREG_SET_ORDER );


     print_r($result);

?>

Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы