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

Статус
В этой теме нельзя размещать новые ответы.

DenisK

Старатель
Заблокирован
Регистрация
8 Фев 2007
Сообщения
207
Реакции
14
  • Автор темы
  • Заблокирован
  • #1
Вдруг засбоил старый скрипт, который раньше работал нормально.


Выдает ошибку
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)

В чем может быть проблема?
 
неоднозначно записанное регулярное выражение ...
ф-ция не понимает че от нее хотят
смотри в переменную $info[1] че там записано
 
  • Автор темы
  • Заблокирован
  • #3
там в цикле подставляются разные значения (стоп слова).
 
да неважно что оно такое и как оно формируется ...
сделайте вывод строки непосредственно перед вызовом preg_match ну и по выведенным регуляркам возможно и будет видно какая из них неверная
 
Вдруг засбоил старый скрипт, который раньше работал нормально.
Выдает ошибку
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)
В чем может быть проблема?

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

PS. А вообще простым echo $info[1] легко посмотреть, что он пытается скормить регулярке.
 
  • Заблокирован
  • #6
preg_match("/$info[1]/i", $text);
Здесь предупреждение в том что ты забыл экранировать массив
вот так ни будет ошибки -
preg_match("/{$info[1]}/i", $text);
скобки это спецсимволы,и если требуется использовать их как текст или оператор значение массива,то нужно их экранировать.

Еще интерпретатор может ругаться если в массиве есть конфликтующие символы(операторы регулярных выражений).
Для того чтобы использовать в регулярном выражении текст содержащий операторы регулярного выражения,нужно сделать экранирование этих символов например -
$info[1] = str_replace(array("/","+"),array("\/","\+"),$info[1]);
 
Дело в том, что в info[1] попали спецсимволы для регулярки: точки плюсы и т.п. слеши. Перед подстанокой обязательно addslashes().
PS. А вообще простым echo $info[1] легко посмотреть, что он пытается скормить регулярке.
Вот только не addslashes, а preg-quote иначе регулярка может работать с ошибками.
 
там в цикле подставляются разные значения (стоп слова).
в таком случае регулярные выражения не имеет смысла использовать

PHP:
if ( strpos($text, $info[1]) !== false ) {
   echo "слово найдено";
}
 
Не стану создавать новую тему помодите изменить вот этот код под 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]));
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху