2016-06-18 1 views
0

Я прочитал свой собственный сайт с file_get_contents для отображения определенного текста. Я показываю данные из интервью, и я хочу получить заголовок интервью и время использовать его на другом сайте (ссылка на интервью).preg_match_all чтение sitesource несколько строк и совпадений

Соответствующий блок кода находится в таблице.

<td> 
    Interview 1 
    <small style="color:gray"> 
     Persons 2 
     Cameras 2 
    </small> 
</td> 
<td> 
    1018 min 
</td> 

Как вы можете видеть, Interview 1 является заголовок и время 1018. Я попробовал это самостоятельно, но каким-то образом картина немного сумасшедшая.

preg_match_all('#<td>\s*(.+?)\s*<small style="color:gray">\s*<\/small>\s*<\/td><td>\s*(.+?)\s*<\/td>#is', $mysite, $match) 

Я использовал \s* для разрывов строк и пробелов и (.+?), чтобы соответствовать. Что случилось с моим шаблоном поиска?

+1

Вы должны смотреть, чтобы РНР [DomDocument] (http://php.net/manual/en/class .domdocument.php). Использование регулярного выражения на HTML редко работает так, как ожидалось. –

+1

Вообще нехорошо разбирать xml/html с регулярным выражением. Это может привести к неожиданному поведению, как вы заметили. – Andreas

+1

Обязательная ссылка на http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – ShiraNai7

ответ

0

Сначала вы должны использовать синтаксический анализатор для этого, регулярные выражения для функции HTML ожидаются. Однако есть два вопроса с вашим регулярным выражением.

Выпуск один:

<small style="color:gray">\s*<\/small> 

Существует не только белое пространство между этим элементом.

Выпуск два:

<\/td><td> 

Существует новая линия между <td> с.

Итак:

<td>\s*(.+?)\s*<small style="color:gray">.+?<\/small>\s*<\/td>\s<td>\s*(.+?)\s*<\/td> 

должны работать для вас (для этого статического примера). Если содержимое элемента small является необязательным, измените значение + на номер *. Обратите внимание, что также с синтаксическим анализатором эти проблемы не были бы проблемой.

+0

Oh didnt заметил ваши результаты! Спасибо за это! Теперь я получаю только последнее вхождение. Я использовал 3 интервью для тестирования, но только получил от последнего. –

+0

Является ли HTML одинаковым для всех 3? – chris85

+0

Да, каждый раз один и тот же html-код –

0

Вот решение с DOMDocument:

$doc = new DOMDocument(); 
$doc->loadHTML($html); 
$xpath = new DOMXpath($doc); 
foreach ($xpath->query('//td/small[@style="color:gray"]') as $small) { 
    $td2 = $td = $small->parentNode; 
    do $td2 = $td2->nextSibling; while($td2->nodeType != 1); 
    $match[] = ["headline" => trim($td->firstChild->textContent), 
       "time" => trim($td2->textContent)]; 
} 
print_r($match); 
0

Это работает:

preg_match_all('#<td>\s*(.*)\s*<small style="color:gray">.*</small>\s*</td>\s*<td>\s*(.*)\s*</td>#is', $mysite, $match); 

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

  • Нет связанных вопросов^_^