PHP preg_match_all соответствует 74 совпадениям из 100 - PullRequest
1 голос
/ 18 апреля 2011

Я работаю над проектом, который включает в себя удаление из основных поисковых систем (точнее - проверка рейтинга страницы и поиск похожих страниц).С помощью curl я вызываю поисковую систему, затем с одним preg_match_all я получаю все результаты в массиве.У меня нет проблем с Google и Bing, но когда я написал скрипт для Yahoo, он работал, но у него есть ошибка.

Я тестирую с поиском "autobedrijf" в Нидерландах.У меня есть 100 результатов на странице, но в результате я получаю только 74 из них в массиве результатов.Я скопировал регулярное выражение в этот инструмент , вставил исходный код страницы Yahoo и там он соответствует всем 100 результатам.

Это первые результаты от Yahoo:

First results from Yahoo

но в массиве я получаю:

-ledensite

-Home Page

-Welkom bij autobedrijf TolsmaExmorra

-etc.

Это означает, что после "Домашней страницы" он пропускает 3 результата.Я пытался найти разницу между результатами 5 и 6 (последний пропущен и следующий), но я не нашел причин не соответствовать 5-му.

Это preg_match_all script:

$pattern = '@<div>\s*<h3>\s*<a[^<>]*\shref="([^*"]*\*\*)*([^<>]*)">
([^<>]*(<b>[^<>]*</b>)*[^<>]*(<wbr>)*[^<>]*)</a>\s*</h3>\s*</div>@siU';
preg_match_all($pattern, $result['EXE'], $matches);

Исходный код страницы Yahoo для этих двух результатов выглядит следующим образом:

<li><div class="res"><div><h3><a dirtyhref="http://nl.wrs.yahoo.com
/_ylt=A7x9Qb3rKqxN1XYA1PhzKAx.;_ylu=X3oDMTBydXF0bjc3BHNlYwNzcgR
wb3MDNQRjb2xvA2lyZAR2dGlkAw--/SIG=11n0lgcgp/EXP=1303157611/**http%3a
//www.autobedrijfgreijmans.nl/" class="yschttl spt" 
href="http://nl.wrs.yahoo.com/_ylt=A7x9Qb3rKqxN1XYA1PhzKAx.;
_ylu=X3oDMTBydXF0bjc3BHNlYwNzcgRwb3MDNQRjb2xvA2lyZAR2dGlkAw--/SIG
=11n0lgcgp/EXP=1303157611/**http%3a//www.autobedrijfgreijmans.nl/">
<b>Autobedrijf</b> Greijmans Weert - Toyota <wbr>Specialist Occasions 
APK</a></h3></div><div class="abstr">In het databestand van 
<b>Autobedrijf</b> Greijmans vindt u zeer eenvoudig tweedehands auto's, 
bedrijfswagens, klassiekers. Kijk snel op onze website</div><span 
class="url">www.<b>autobedrijfgreijmans.nl</b></span> - <a 
href="http://nl.wrs.yahoo.com/_ylt=A7x9Qb3rKqxN1XYA1fhzKAx./SIG=
186dh8afd/EXP=1303157611/**http%3a//74.6.239.67/search/cache%3fei=
UTF-8%26p=autobedrijf%26n=100%26va_vt=any%26vo_vt=any%26vp_vt
=any%26vst=0%26vf=all%26vm=p%26u=www.autobedrijfgreijmans.nl/
%26w=autobedrijf%26d=IxshPvbJWijU%26icp=1%26.intl=nl%26sig=yI6R7vJN31J
T92YKlVnT1g--">In de cache</a></div></li>

<li><div class="res"><div><h3><a dirtyhref="http://nl.wrs.yahoo.com
/_ylt=A7x9Qb3rKqxN1XYA1vhzKAx.;_ylu=X3oDMTBybWh0ZnN2BHNlYwNzcgRwb3MDNg
Rjb2xvA2lyZAR2dGlkAw--/SIG=11l17c21h/EXP=1303157611/**http%3a//www.
autobedrijf-tolsma.nl/" class="yschttl spt" href="http://www.autobedrijf
-tolsma.nl/">Welkom bij <b>autobedrijf</b> Tolsma Exmorra</a></h3></div>
<div class="abstr">Welkom op de vernieuwde website van <b>autobedrijf</b> 
Tolsma Exmorra incl.digitale showroom <b>...</b> Welkom bij <b>autobedrijf
</b> tolsma. Op deze site nodigen wij U uit een <b>...</b></div><span 
class="url">www.<b>autobedrijf-tolsma.nl</b></span> - <a href="http://nl.
wrs.yahoo.com/_ylt=A7x9Qb3rKqxN1XYA1_hzKAx./SIG=1840la9c5/EXP=1303157611/
**http%3a//74.6.239.67/search/cache%3fei=UTF-8%26p=autobedrijf%26n=100
%26va_vt=any%26vo_vt=any%26vp_vt=any%26vst=0%26vf=all%26vm=p%26u=
www.autobedrijf-tolsma.nl/%26w=autobedrijf%26d=YBZQIvbJWlDf%26icp=1%26.
intl=nl%26sig=zRU95PdBOTfII93dZ411ZA--">In de cache</a></div></li>

Я застрял на этом уже более 5 часов и могуВыяснить, почему инструменты регулярных выражений соответствуют обоим результатам, в то время как preg_match_all в PHP соответствует только второму .

Если это имеет значение - я тестирую на Windows сApache и PHP 5.3.5.

Любые советы приветствуются, я могу предоставить дополнительные примеры и протестировать код, если вам интересно.

Ответы [ 2 ]

2 голосов
/ 18 апреля 2011

Неполированная отправная точка:

<?php

$url = 'http://nl.search.yahoo.com/search?p=autobedrijf&toggle=1&cop=mss&ei=UTF-8&fr=yfp-t-732';

$html = file_get_contents($url);

$doc = new DOMDocument;
libxml_use_internal_errors(TRUE);
$doc->loadHTML($html);
libxml_use_internal_errors(FALSE);

$titles = $doc->getElementsByTagName('h3');
foreach($titles as $t){
    echo $t->nodeValue . PHP_EOL;
}

?>
1 голос
/ 18 апреля 2011

Я рекомендую использовать Yahoo API. Они предлагают очень хорошие услуги для достижения результатов Yahoo с помощью языка запросов Yahoo. http://developer.yahoo.com/yql/

пример:

http://developer.yahoo.com/yql/console/#h=select%20*%20from%20search.web%20where%20query%3D%22autobedrijf%22

...