2013-09-24 2 views
1

Я использую регулярные выражения для извлечения данных с веб-сайта, но теперь я нашел проблему.Поиск нескольких шаблонов внутри шаблона

Это часть исходного HTML, который я хочу проанализировать. Я хочу извлечь текст после «descuentos-» и города после «< a href >».

<div id="cities2_2"> 
    <a href = "http://website.com/descuentos-espana/">Badajoz</a> 
    <a href = "http://website.com/descuentos-espana/">Badalona</a> 
    <a href = "http://website.com/descuentos-barcelona/">Barcelona</a> 
    <a href = "http://website.com/descuentos-bilbao/">Bilbao</a> 
    <a href = "http://website.com/descuentos-espana/">Burgos</a> 
</div> 
</div> 
<div class="capa_cities" onmouseover="act_formato(3, 2);" 
    onmouseout="desact_formato(3, 2);"> 
<h2 id="title_city3_2">C</h2> 
<div id="cities3_2"> 
    <a href = "http://website.com/descuentos-espana/">Cáceres</a> 
    <a href = "http://website.com/descuentos-cadiz/">Cádiz</a> 
    <a href = "http://website.com/descuentos-espana/">Cartagena</a> 
    <a href = "http://website.com/descuentos-espana/">Castellón</a> 
    <a href = "http://website.com/descuentos-espana/">Ceuta</a> 
    <a href = "http://website.com/descuentos-espana/">Ciudad Real</a> 
    <a href = "http://website.com/descuentos-cordoba/">Córdoba</a> 
    <a href = "http://website.com/descuentos-espana/">Cuenca</a> 

я мог смотреть на < A HREF = "http://website.com/descuentos- (. *)" >, но есть и другие, которые соответствуют шаблону на сайте. Итак, у меня теперь есть этот шаблон:

#<div id="cities[0-9]+_2">(<a href = "http://website.com/descuentos-(.*?)/">(.*?)</a>)*# 

Я бы хотел, чтобы он был рекурсивным. Я имею в виду: для каждого "< a href =" http://website.com/descuentos- (. *)/"> (. *) </a >" Найдено, найдите два небольших рисунка внутри.

Есть ли способ достичь этого в регулярном выражении, или мне нужно переработать его через preg_match_all?

+0

ли вы рассмотреть возможность использования HTML-парсер? – Jerry

+0

Для других более легких кусков, таких как большинство, которые я буду добывать, я думал, что это будет излишним. Для этого, в частности, да, но я бы предпочел использовать одно и то же везде. – markmb

+0

Что бы вы хотели найти, после получения матчей? – mavrosxristoforos

ответ

2

Вариант 1: быстрый способ: Да, использование preg_match_all()

preg_match_all('#<a href = "http://website.com/descuentos-(.*?)/">.*?</a>#', $str, $matches); 

echo "<pre>"; 
print_r($matches); 
echo "</pre>"; 

возвращается:

Array 
(
    [0] => Array 
     (
      [0] => Badajoz 
      [1] => Badalona 
      [2] => Barcelona 
      [3] => Bilbao 
      [4] => Burgos 
      [5] => Cáceres 
      [6] => Cádiz 
      [7] => Cartagena 
      [8] => Castellón 
      [9] => Ceuta 
      [10] => Ciudad Real 
      [11] => Córdoba 
      [12] => Cuenca 
     ) 

    [1] => Array 
     (
      [0] => espana 
      [1] => espana 
      [2] => barcelona 
      [3] => bilbao 
      [4] => espana 
      [5] => espana 
      [6] => cadiz 
      [7] => espana 
      [8] => espana 
      [9] => espana 
      [10] => espana 
      [11] => cordoba 
      [12] => espana 
     ) 

    [2] => Array 
     (
      [0] => Badajoz 
      [1] => Badalona 
      [2] => Barcelona 
      [3] => Bilbao 
      [4] => Burgos 
      [5] => Cáceres 
      [6] => Cádiz 
      [7] => Cartagena 
      [8] => Castellón 
      [9] => Ceuta 
      [10] => Ciudad Real 
      [11] => Córdoba 
      [12] => Cuenca 
     ) 

) 

Time elapsed: 0.000104904174805 

Вариант 2: DOM Parser: ($ ул ЯВЛЯЕТСЯ ВАШЕЙ текст);

$dom = new DomDocument(); 
$dom->loadHTML($str); 

$links = $dom->getElementsByTagName('a'); 

foreach($links as $link){ 
    $href = $link->getAttribute('href'); 

    echo $href." ### ";//prints the href 
    preg_match('#descuentos-(.*)/#', $href, $match); 
    echo $link->nodeValue." - ".$match[1]."<br/>"; 
} 

Output (добавить заголовки в UTF-8, чтобы увидеть правильные символы):

http://website.com/descuentos-espana/ ### Badajoz - espana 
http://website.com/descuentos-espana/ ### Badalona - espana 
http://website.com/descuentos-barcelona/ ### Barcelona - barcelona 
http://website.com/descuentos-bilbao/ ### Bilbao - bilbao 
http://website.com/descuentos-espana/ ### Burgos - espana 
http://website.com/descuentos-espana/ ### Cáceres - espana 
http://website.com/descuentos-cadiz/ ### Cádiz - cadiz 
http://website.com/descuentos-espana/ ### Cartagena - espana 
http://website.com/descuentos-espana/ ### Castellón - espana 
http://website.com/descuentos-espana/ ### Ceuta - espana 
http://website.com/descuentos-espana/ ### Ciudad Real - espana 
http://website.com/descuentos-cordoba/ ### Córdoba - cordoba 
http://website.com/descuentos-espana/ ### Cuenca - espana 
Time elapsed: 0.000319004058838 
+0

Говоря о регулярном выражении, я не могу использовать форму «href», потому что есть другие совпадающие вещи, которые мне не нужны, поэтому я должен искать родительский тег и немного рекурсии. Про парсер, я попробую. – markmb

+0

. Тогда причина в том, чтобы использовать DOM Parser определенно, если все те теги находятся внутри элемента с определенным классом или идентификатором, вы не можете легко мигрировать этот элемент с помощью getElementById() или getElementByClassName(), чтобы получить его дочерние элементы и выполнить цикл они забывают о фрагментах html, которые вы не хотите из документа – aleation

Смежные вопросы