Нужна помощь с регулярными выражениями в PHP - PullRequest
0 голосов
/ 10 ноября 2010

Я пытаюсь проиндексировать некоторый контент из серии .html, имеющих одинаковый формат.

Итак, я получаю много таких строк: <a href="meh">[18] blah blah blah < a...

И идея состоит в том, чтобы извлечь число (18) и текст рядом с ним (бла ...). Кроме того, я знаю, что каждая квалификационная строка начинается с "> и заканчивается либо <a, либо </p. Проблема связана с необходимостью сохранения всех других тегов htmHTML как части текста (<i>, <u> и т. Д.).

Итак, у меня есть что-то вроде этого:

$docString = file_get_contents("http://whatever.com/some.htm");
$regex="/\">\ [(.*?)\ ] (<\/a>)(.) *?(<)/";
preg_match_all($regex,$docString,$match);

Давайте посмотрим на $regex на секунду. Проигнорируйте это пробелы, я просто помещаю их здесь, потому что иначе некоторые символы исчезают. Я уточняю, что это начнется с ">. Затем я делаю числа внутри вещи []. Затем я выделяю </a>. Пока все хорошо.

В конце я делаю (.)*?(<). Это поворотный момент. Оставляя последний бит, (<), как этот, текст будет прерван при обнаружении тега подчеркивания или курсива. Однако, если я поставлю (<a|</p), результирующий массив окажется пустым. Я попытался изменить это только на (<a), но кажется, что 2 символа испортили весь тинг.

Что я могу сделать? Я боролся с этим весь день.

Ответы [ 3 ]

1 голос
/ 10 ноября 2010
1 голос
/ 11 ноября 2010

Что-то вроде /">\[(.*)\](.*)(?:<(?:a|\/p))/, кажется, работает нормально для вашего примера и описания. Возможно, добавление не захватывающих подшаблонов делает это? Пожалуйста, предоставьте контрпример, где это не работает для вас.

Хотя я согласен с тем, что RegEx не является синтаксическим анализатором, похоже, то, что вы ищете, является частью строки с регулярным поведением.

0 голосов
/ 10 ноября 2010

Как вы обнаружили, использовать регулярные выражения для разбора HTML не очень просто. Это потому, что HTML не совсем регулярный.

Я предлагаю использовать синтаксический анализатор XML, такой как PHP DomDocument .

Создайте объект, затем используйте метод loadHTMLFile , чтобы открыть файл. Извлеките свои a теги с помощью getElementsByTagName , а затем извлеките содержимое как свойство NodeValue.

Это может выглядеть как

// Create a DomDocument object 
$html = new DOMDocument(); 

// Load the url's contents into the DOM 
$html->loadHTMLFile("http://whatever.com/some.htm"); 

// make an array to hold the text 
$anchors = array(); 

//Loop through the a tags and store them in an array 
foreach($html->getElementsByTagName('a') as $link) { 
    $anchors[] = $link->nodeValue;
    } 

Одной из альтернатив этому стилю синтаксического анализатора XML / HTML является phpquery . Документация на их странице должна помочь объяснить, как извлечь теги. Если вы знаете jQuery, интерфейс может показаться более естественным.

...