preg_match выдает предупреждение

Тема в разделе "Регулярные выражения", создана пользователем DenisK, 21 мар 2011.

Статус темы:
Закрыта.
Модераторы: xpert13
  1. DenisK

    DenisK

    Регистр.:
    8 фев 2007
    Сообщения:
    206
    Симпатии:
    14
    Вдруг засбоил старый скрипт, который раньше работал нормально.


    Выдает ошибку
    Warning: preg_match() [function.preg-match]: Compilation failed: nothing to repeat at offset 0 in /home/superdos/public_html/init.php on line 58

    Код на котором выдается ошибка

    preg_match("/$info[1]/i", $text)

    В чем может быть проблема?
     
  2. chang

    chang

    Регистр.:
    20 ноя 2009
    Сообщения:
    363
    Симпатии:
    117
    неоднозначно записанное регулярное выражение ...
    ф-ция не понимает че от нее хотят
    смотри в переменную $info[1] че там записано
     
  3. DenisK

    DenisK

    Регистр.:
    8 фев 2007
    Сообщения:
    206
    Симпатии:
    14
    там в цикле подставляются разные значения (стоп слова).
     
  4. chang

    chang

    Регистр.:
    20 ноя 2009
    Сообщения:
    363
    Симпатии:
    117
    да неважно что оно такое и как оно формируется ...
    сделайте вывод строки непосредственно перед вызовом preg_match ну и по выведенным регуляркам возможно и будет видно какая из них неверная
     
    DenisK нравится это.
  5. horpah

    horpah

    Регистр.:
    21 июн 2010
    Сообщения:
    199
    Симпатии:
    55
    Дело в том, что в info[1] попали спецсимволы для регулярки: точки плюсы и т.п. слеши. Перед подстанокой обязательно addslashes().

    PS. А вообще простым echo $info[1] легко посмотреть, что он пытается скормить регулярке.
     
    DenisK нравится это.
  6. dexgun

    dexgun Постоялец

    Заблокирован
    Регистр.:
    26 сен 2010
    Сообщения:
    63
    Симпатии:
    19
    preg_match("/$info[1]/i", $text);
    Здесь предупреждение в том что ты забыл экранировать массив
    вот так ни будет ошибки -
    preg_match("/{$info[1]}/i", $text);
    скобки это спецсимволы,и если требуется использовать их как текст или оператор значение массива,то нужно их экранировать.

    Еще интерпретатор может ругаться если в массиве есть конфликтующие символы(операторы регулярных выражений).
    Для того чтобы использовать в регулярном выражении текст содержащий операторы регулярного выражения,нужно сделать экранирование этих символов например -
    $info[1] = str_replace(array("/","+"),array("\/","\+"),$info[1]);
     
  7. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    890
    Симпатии:
    561
    Вот только не addslashes, а preg-quote иначе регулярка может работать с ошибками.
     
  8. AXP

    AXP Создатель

    Регистр.:
    16 мар 2007
    Сообщения:
    27
    Симпатии:
    2
    в таком случае регулярные выражения не имеет смысла использовать

    PHP:
    if ( strpos($text$info[1]) !== false ) {
       echo 
    "слово найдено";
    }
     
  9. Shaly

    Shaly Создатель

    Регистр.:
    8 апр 2010
    Сообщения:
    47
    Симпатии:
    12
    Не стану создавать новую тему помодите изменить вот этот код под preg_match
    Было
    PHP:
    while (ereg("(x/)+x"$unpackstr$r))
    $unpackstr substr_replace($unpackstr'x'.((strlen($r[0])+1)/2), strpos($unpackstr$r[0]), strlen($r[0]));
    Попробовал изменить
    PHP:
    while (preg_match("/(x/)+x/"$unpackstr$r))
    $unpackstr substr_replace($unpackstr'x'.((strlen($r[0])+1)/2), strpos($unpackstr$r[0]), strlen($r[0]));
    Попытка сделать вот так:
    PHP:
     while (preg_match("(x/)+x"$unpackstr$r))
          
    $unpackstr substr_replace($unpackstr'x'.((strlen($r[0])+1)/2), strpos($unpackstr$r[0]), strlen($r[0]));
    Warning: preg_match() [function.preg-match]: Unknown modifier '+'

    Кое как нашёл решение:

    PHP:
    while (preg_match("/(x\\/)+x/"$unpackstr$r))
     
          
    $unpackstr substr_replace($unpackstr'x'.((strlen($r[0])+1)/2), strpos($unpackstr$r[0]), strlen($r[0]));
     
Статус темы:
Закрыта.