ФорумПрограммированиеПыхнуть хотите?Готовые решения → Парсинг элементов html DOM

Парсинг элементов html DOM

  • andipas

    Сообщения: 170 Репутация: N Группа: Кто попало

    Spritz 18 августа 2010 г. 9:24

    Свое знакомство с php я начал именно с парсинга, в дальнейшем для облегчения я попробовал использовать Simple HTML DOM Parser. С ним работать очень удобно, но он жрет очень много памяти, и там где происходит много итераций с его участием скрипт завершает свою работу с Fatal error из за не хватки памяти.

    Вообщем нашел я ему замену, регулярка которая парсит содержимое элемента по указному id или class-у.


    class ParsDom {

    public $sContent = '';

    public function getElement($sId = '', $sElem = 'div') {
    if (!$sId || !$this->sContent) return '';
    $aOut[0] = array();
    $sReg = "
    /
    <{$sElem}[^>]+\b(?:class|id)=[\"\']?{$sId}[\"\']?[^>]*>
    (?:
    (<{$sElem}[^>]*>*?<\/{$sElem}>)|
    .
    )*?
    <\/{$sElem}>
    /xsS";

    preg_match_all($sReg, $this->sContent, $aOut);

    if (isset($aOut[0]))
    return $aOut[0];
    else
    return '';
    }
    }

    // Пример
    $oParsDom = new ParsDom;

    // Контент от куда будем парсить
    $oParsDom->sContent = $sData;

    // Парсим все DIV элементы с указаным id или классом
    $aDiv = $oParsDom->getElement('class_or_id_name');

    // Парсим все LI элементы с указаным id или классом
    $aLi = $oParsDom->getElement('menu', 'li');
    [/php]
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 18 августа 2010 г. 10:20, спустя 56 минут 8 секунд

    вопрос - нахуй в класс обернули :D

    решение неплохое для простых операцй
    Сапожник без сапог
  • andipas

    Сообщения: 170 Репутация: N Группа: Кто попало

    Spritz 18 августа 2010 г. 10:40, спустя 19 минут 45 секунд


    вопрос - нахуй в класс обернули :D

    решение неплохое для простых операцй


    Да думаю нарастить еще туда чего нибудь потом. А так да, я долго пользовался этим в виде функции.
    Спустя 146 сек.

    $aOut[0] = array();


    ступил, это можно убрать оттуда
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 18 августа 2010 г. 12:00, спустя 1 час 20 минут 20 секунд

    лучше вместо $sContent, делайте

    class ParsDom
    {
    /**
    * Store`s content
    *
    * @var string
    */
    private $_content = '';
    }

    А почему название ParsDom, а не, допустим DOMParser?

  • VaseninM

    Сообщения: 2416 Репутация: N Группа: Адекваты

    Spritz 18 августа 2010 г. 14:42, спустя 2 часа 41 минуту 28 секунд

    krasun, это почему?
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 18 августа 2010 г. 15:44, спустя 1 час 2 минуты 27 секунд

    SpartakuS, да так просто.

    Если человек работает в IDE и ему реально важен тип переменной с которой он работает, то можно как я сказал. А если человек работает в блокноте и ему нужно знать тип переменной, то тогда я не прав.

    А второе я имел ввиду $_content - сделать приватным. И уже контролировать доступ к нему.
  • VaseninM

    Сообщения: 2416 Репутация: N Группа: Адекваты

    Spritz 18 августа 2010 г. 17:29, спустя 1 час 44 минуты 33 секунды

    krasun, я хоть и на нетбинсе пишу - всеравно так пишу. Это все Shuranov со своим vim`ом мне навязал стиль. >:-] Но это все дело вкуса.
    На счет приватности. Ну может и стоит. Но в данном случае поять же дело вкуса.
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 18 августа 2010 г. 17:32, спустя 3 минуты

    Если с именованием переменных я согласен, что это дело вкуса. То с уровнем доступа к данным объекта я не согласен. Ибо если мы делаем $_content открытым, то мы нарушаем инкапсуляцию, а значит это уже не есть ООП, а _уй знает что. Хотя, может ты и прав, что это дело вкуса.
  • VaseninM

    Сообщения: 2416 Репутация: N Группа: Адекваты

    Spritz 18 августа 2010 г. 17:40, спустя 8 минут 49 секунд

    krasun, ты конечно прав на мой взгляд ибо сам все для всех подобных переменных делаю get и set методы. Что меня в этом радует - можно на лету данные проверять и потом не заморачиватся. Но и не прав тоже.
    $object->var;

    $object->getVar();
    $object->setVar($var);

    Сфига ли второй черный ящик, а первый нет? Короче философия это.
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 18 августа 2010 г. 23:24, спустя 5 часов 43 минуты 44 секунды

    $object->setVar($var);

    часто вот это может отсутствовать, а задаваться только в кострукторе
    Сапожник без сапог
  • andipas

    Сообщения: 170 Репутация: N Группа: Кто попало

    Spritz 19 августа 2010 г. 0:42, спустя 1 час 17 минут 34 секунды

    лучше вместо $sContent, делайте

    Сначала, тоже так подумал, но мысли были примерно такие же -
    $object->getVar();
    $object->setVar($var);
    Сфига ли второй черный ящик, а первый нет? Короче философия это.

    Просто в моем варианте, выходит короче код )
    А почему название ParsDom, а не, допустим DOMParser?

    Я не давно начал переходить с функций на классы, названия функций у меня обычно отвечало на вопрос "Что делать?", так и с классами. Хотя это ведь в дальнейшем объекты, поэтому название DOMParser будет правильней :)
  • VaseninM

    Сообщения: 2416 Репутация: N Группа: Адекваты

    Spritz 19 августа 2010 г. 4:19, спустя 3 часа 37 минут 6 секунд

    phpdude, в его случае это правильное решение :)
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 19 августа 2010 г. 6:20, спустя 2 часа 1 минуту 19 секунд


    krasun, ты конечно прав на мой взгляд ибо сам все для всех подобных переменных делаю get и set методы. Что меня в этом радует - можно на лету данные проверять и потом не заморачиватся. Но и не прав тоже.
    $object->var;

    $object->getVar();
    $object->setVar($var);

    Сфига ли второй черный ящик, а первый нет? Короче философия это.

    Вот тот, черный ящик с getVar() и setVar(); - ты не знаешь, что там происходит, валидация, фильтрация, запись в БД и так далее. А в $object->var я могу записать, что хочу и не по назначению. И проверок не будет, потом где-то баг вылезет.
  • VaseninM

    Сообщения: 2416 Репутация: N Группа: Адекваты

    Spritz 19 августа 2010 г. 6:47, спустя 26 минут 55 секунд

    krasun,
    Что меня в этом радует - можно на лету данные проверять и потом не заморачиватся.

    ;)
  • felix90

    Сообщения: 191 Репутация: N Группа: Адекваты

    Spritz 24 августа 2010 г. 15:18, спустя 5 дней 8 часов 30 минут

Пожалуйста, авторизуйтесь, чтобы написать комментарий!