preg_match_all не захватывает все намеченные результаты - PullRequest
3 голосов
/ 24 июня 2010

Я пытаюсь получить информацию из следующего источника:

<random htmlcode here>
<td style="BORDER-RIGHT-STYLE:none;">
      <a id="dgWachtlijstFGI_ctl03_hlVolnaam" title="Klant wijzigen" class="wl" href="javascript: Pop(600,860,'klantwijzig','FrmKlant.aspx','?  Wijzig=true&amp;lcSchermTitel=&amp;zoekPK=+++140+12++8',false,true); ">FIRST LINE A</a>
      (SECOND LINE A)<br>
      THIRD LINE A        </td>
<random htmlcode here>
<td style="BORDER-RIGHT-STYLE:none;">
      <a id="dgWachtlijstFGI_ctl04_hlVolnaam" title="Klant wijzigen" class="wl" href="javascript: Pop(600,860,'klantwijzig','FrmKlant.aspx','?Wijzig=true&amp;lcSchermTitel=&amp;zoekPK=+++140+12++8',false,true); ">FIRST LINE B</a>
       (SECOND LINE B)<br>
      THIRD LINE B        </td>
<random htmlcode here>

На этом этапе я придумал следующее (спасибо rubular.com)

<?php $bestand = 'input.htm';
$fd = fopen($bestand,"r");
$message = fread($fd, filesize    ($bestand));
$regexp = "FrmKlant.aspx.*\">(.*)<\/a>\s(.*)<br>\s(.*)\s\s(.*)"; 
if   (preg_match_all("#$regexp#siU", $message, $matches)) 
{   
print_r($matches);
}?
>

На самом деле кажется, что первая и вторая нужные мне строки помещаются в многомерный массив. Пока все хорошо, потому что я хочу многомерный массив. Тем не менее, это не похоже на 3-ю строку. И как-то это создает массив [4]

[1] => Array ( [0] => FIRST LINE A [1] => FIRST LINE B ) 
[2] => Array ( [0] =>  (SECOND LINE A) [1] => (SECOND LINE B) ) 
[3] => Array ( [0] => [1] => ) [4] => Array ( [0] => [1] => )

То, что я ищу, это:

[0] => Array ( [0] => FIRST LINE A [1] => FIRST LINE B ) 
[1] => Array ( [0] =>  (SECOND LINE A) [1] =>  (SECOND LINE B) ) 
[2] => Array ( [0] => THIRD LINE A [1] => THIRD LINE B ) )

Ответы [ 3 ]

5 голосов
/ 24 июня 2010

Использование PHP DOM-парсера

Неполный пример, но кое-что для начала:

$dom = new DOMDocument();
$dom->loadHTML($yourHtmlDocument);

$xPath = new DOMXPath($dom);
$elements = $xPath->query('\\random\td\a'); // Or whatever your real path would be

foreach($elements as $node) {
  echo $node->nodeValue;
}

Кстати, посмотрите на это.

0 голосов
/ 24 июня 2010

Обычно пытаться извлекать информацию из HTML / XML с помощью регулярных выражений не очень хорошая идея.Они не очень хорошо подходят для работы с вложенными структурами.Все, что вы можете попробовать, ужасно сломается, если ваши «случайные html» части достаточно злые, поэтому используйте их, только если у вас очень хороший контроль над html.

Вместо этого попробуйте парсер.(Google нашел меня http://simplehtmldom.sourceforge.net/, Я еще не пробовал)

0 голосов
/ 24 июня 2010
$regexp = "FrmKlant.aspx.*\">(.*)<\/a>\s(.*)<br>\s(.*)\s\s(.*)</td>"; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...