За последние 24 часа нас посетили 19496 программистов и 1601 робот. Сейчас ищут 1033 программиста ...

Undefined offset с массивом из preg_match

Тема в разделе "Прочие вопросы по PHP", создана пользователем lisss, 9 дек 2013.

  1. lisss

    lisss Новичок

    С нами с:
    9 дек 2013
    Сообщения:
    5
    Симпатии:
    0
    Написал граббер для одного сайта для удобного чтения с планшета, до этого с регулярками не работал. Граббер работает, но в error_log постоянно сыплются ошибки Undefined offset для всех массивов, полученных из preg_match. Вот для примера:
    Код (Text):
    1. preg_match('/<div class=\"pages\">(.*?)<\/div>/ims',$data,$matches); //$data - это текст страницы, полученный curl-ом
    2. $pager=$matches[1]; //вот на эту строку ругается Undefined offset: 1
    3. echo '<div class="pager">'.$pager.'</div>'; //при этом тут все выводит правильно
    При этом count($matches) выдает 2, print_r($matches) тоже выводит 2 элемента массива (полный текст совпадения шаблона и нужную строку).

    В гугле был - ничего не нашел.

    P.S. phpversion() выдает 5.3.15
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    добавь такой код:
    Код (PHP):
    1. if (!isset($matches[1]) {var_dump($matches);} 
    и посмотри че покажет
     
  3. lisss

    lisss Новичок

    С нами с:
    9 дек 2013
    Сообщения:
    5
    Симпатии:
    0
    фигня какая-то...
    если добавляю вашу строчку с if (что у вас скобочки не хватает я заметил), то условие не выполняется и ничего не выводит...
    без if, выводит:
    array(2) {
    [0]=>
    string(1182) "{тут очень большой текст всей строки}"
    [1]=>
    string(1157) "{тут очень большой текст искомой подстроки}"
    }

    Я думаю проблема с объявлением переменной, но как объявить $matches перед выполнением?

    P.S. попробовал перед preg_match объявить $matches = array(); - не помогло.
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    да не. в матчес каждый раз новое пишется.
    ну короче надо как-то отловить что внутри матчес в тот момент, когда ругается.
     
  5. lisss

    lisss Новичок

    С нами с:
    9 дек 2013
    Сообщения:
    5
    Симпатии:
    0
    хм... а var_dump - это не показатель? после моего кода с var_dump я обращаюсь ко второму элементу массива matches[1] и получаю ошибку в лог.
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    о_О
    давай-ка ты код покажи целиком этого куска
     
  7. lisss

    lisss Новичок

    С нами с:
    9 дек 2013
    Сообщения:
    5
    Симпатии:
    0
    Сделал по-другому: написал новый скрипт, чтобы показать вывод полностью.
    Скрипт полностью:
    Код (Text):
    1. <?php
    2. $data = "qwerty #asd# zxcvb";
    3. preg_match('/#(.*?)#/ims',$data,$matches);
    4. if (!isset($matches[1])) { var_dump($matches); } else { echo 'нет первого элемента <br>'; };
    5. var_dump($matches);
    6. echo '<br>'.$matches[1];
    7. ?>
    Вывод полностью:
    Код (Text):
    1. нет первого элемента
    2. array(2) { [0]=> string(5) "#asd#" [1]=> string(3) "asd" }
    3. asd
    Сообщение в error_log при обновлении этой страницы:
    Код (Text):
    1. Undefined offset: 1 in /srv/www/test/test.php on line 6
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    if (!isset($matches[1])) { var_dump($matches); } else { echo 'ЕСТЬ первого элемента <br>'; };

    но вообще конечно странно
     
  9. lisss

    lisss Новичок

    С нами с:
    9 дек 2013
    Сообщения:
    5
    Симпатии:
    0
    Обновил в системе все пакеты с *php* - не помогло, обновил вобще все пакеты на тестовой копии - перестало выдавать сообщения в логи. phpversion по-прежнему выдает 5.3.15. Какой модуль отвечает за регулярки? А то боязно тотально обновлять боевой сервер.
     
  10. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Да вроде нет отдельного