Пожалуйста, укажите правильное регулярное выражение - PullRequest
0 голосов
/ 30 июля 2010

Я хочу получить данные между <table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#EBEBEB"> и </table>, используя Php.Can любой может указать, пожалуйста, правильное регулярное выражение для получения данных между тегами данной таблицы

Ответы [ 3 ]

2 голосов
/ 30 июля 2010

Я считаю, что вам нужно XPath , а не регулярные выражения.

1 голос
/ 30 июля 2010

Хотя регулярные выражения могут быть полезны для самых разных задач, я считаю, что при анализе HTML DOM обычно не хватает. Проблема с HTML заключается в том, что структура вашего документа настолько изменчива, что трудно точно (и я имею в виду 100% -ный показатель успеха без ложных срабатываний) извлечь тег.

Я рекомендую вам использовать синтаксический анализатор DOM, например phpQuery, и использовать его так:

function get_first_image($html){
    $dom = phpQuery::newDocument($html);

    $first_img = $dom->find('img:first');

    if($first_img !== null) {
        return $first_img->attr('src');
    }

    return null;
}

Кто-то может подумать, что это излишне, но, в конце концов, его будет проще поддерживать, а также обеспечит большую расширяемость. Например, используя анализатор DOM, я также могу получить атрибут alt.

Регулярное выражение может быть разработано для достижения той же цели, но оно будет ограничено таким образом, что атрибут alt будет следовать после src или наоборот, а преодоление этого ограничения добавит больше сложности. к регулярному выражению.

Кроме того, учтите следующее. Чтобы правильно сопоставить тег <img> с помощью регулярных выражений и получить только атрибут src (захваченный в группе 2), вам необходимо следующее регулярное выражение:

<\s*?img\s+[^>]*?\s*src\s*=\s*(["'])((\\?+.)*?)\1[^>]*?>

И снова, вышеописанное может завершиться неудачей, если:

  • Имя атрибута или тега указано заглавными буквами, а модификатор i не используется.
  • Кавычки не используются вокруг атрибута src.
  • Другой атрибут, тогда src использует символ > где-то в своем значении.
  • Какую-то другую причину, которую я не предвидел.

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

1 голос
/ 30 июля 2010

Это зависит от того, что вы получаете.Я сам не профессионал в PHP, но вот как бы я поступил так:

<?php
    $contents = file_get_contents($_SERVER['PHP_SELF']);
    $array = explode("<table width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#EBEBEB\">", $contents);
    $newarray = explode("</table>", $array[1]);
    $yourdata = $newarray[0];
?>

Вам следует использовать этот метод, если вы не возражаете против того, чтобы остальная часть исходного HTML была там.В противном случае, у кого-то еще может быть лучшее решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...