HTML tablodan veri ayıklamak için php regex

4 Cevap php

Ben bir tablo dışında bazı verileri almak için bir regex yapmaya çalışıyorum.

Ben şimdi var kodu:

<table>
   <tr>
     <td>quote1</td>
     <td>have you trying it off and on again ?</td>
   </tr>
   <tr>
     <td>quote65</td>
     <td>You wouldn't steal a helmet of a policeman</td>
   </tr>
</table>

Bu benim ile değiştirmek istiyor:

quote1: Eğer tekrar onu çalışıyor ve var?

quote65: Bir polis bir kask çalmak olmaz

Ben zaten yazdım kod şudur:

%<td>((?s).*?)</td>%

Ama şimdi ben şaşırıp.

4 Cevap

Tim'in regex muhtemelen çalışır, ancak biçimlendirme küçük değişiklikler ile ilgili olarak daha güvenilir olabilir gibi, DOM PHP işlevlerini yerine regex kullanarak düşünebilirsiniz.

Bkz the loadHTML method

Eğer gerçekten Regexes (sizin dize her zaman ki gibi biçimlendirilir gerçekten eminseniz Tamam olabilir), ne durumda böyle bir şey, hakkında kullanmak istiyorsanız:

$str = <<<A
<table>
   <tr>
     <td>quote1</td>
     <td>have you trying it off and on again ?</td>
   </tr>
   <tr>
     <td>quote65</td>
     <td>You wouldn't steal a helmet of a policeman</td>
   </tr>
</table>
A;

$matches = array();
preg_match_all('#<tr>\s+?<td>(.*?)</td>\s+?<td>(.*?)</td>\s+?</tr>#', $str, $matches);

var_dump($matches);

Regex hakkında birkaç kelime:

  • <tr>
  • o alanlarda herhangi bir sayı
  • sonra <td>
  • o zaman ne yakalamak istiyorum
  • sonra </td>
  • ve yine aynı
  • ve son olarak, </tr>

Ve ben kullanın:

  • ? regex olmayan açgözlü modda maç
  • preg_match_all tüm maçları almak için

Daha sonra $matches[1] ve $matches[2] (not $matches[0]) ; here's the output of the var_dump Ben kullanılan istediğiniz sonuçları elde (I've remove entry 0, to make it shorter):

array
  0 => 
    ...
  1 => 
    array
      0 => string 'quote1' (length=6)
      1 => string 'quote65' (length=7)
  2 => 
    array
      0 => string 'have you trying it off and on again ?' (length=37)
      1 => string 'You wouldn't steal a helmet of a policeman' (length=42)

Daha sonra sadece bazı dizeleri birleştirme veya benzeri ile bu dizi, işlemek gerekir; Örneğin, bu gibi:

$num = count($matches[1]);
for ($i=0 ; $i<$num ; $i++) {
    echo $matches[1][$i] . ':' . $matches[2][$i] . '<br />';
}

Ve sen olsun:

quote1:have you trying it off and on again ?
quote65:You wouldn't steal a helmet of a policeman

Not: (like preg_match_all return gereken bazı güvenlik kontrolleri eklemek gerekir doğrudur, saymalı olmak en az 1, ...)

Bir yan not olarak: {[(0)];} Eğer gerçek bir çözümleyici kullanabilirsiniz eğer, bu yol daha güvenli olmalı ...

Her zamanki gibi, HTML ve diğer non-normal dillerden açılan metin Çözümleyici ile yapılmalıdır - regexes burada sorunlara neden olabilir. Eğer verinin yapısının belirli konum Ama eğer kullanabilirsiniz

%<td>((?s).*?)</td>\s*<td>((?s).*?)</td>%

metin iki parçaları bulmak için. \ 1: \ 2 daha sonra bir yedek olacaktır.

Metin bir satır fazla yayılabilir yapamıyorsanız, size (?s) bit bırakarak daha güvenli olurdu ...

Bir HTML ayrıştırıcı kullanmak, regex kullanmayın. Bu {[(0)] olarak}