Выражение: строка в которой нет заданного слова

KolyaA

Новичок
Выражение: строка в которой нет заданного слова

Надо составить регулярное выражение:

Ищущее "строку в которой нет сочетания 'gif' "

Сижу уже несколько часов над этим. Что-то ничего более разумного чем

^(.*)(gif){0}(.*)$
^(.*)(?!gif)(.*)$

Почему это не работает примерно понимаю, но как сделать по-другому не знаю. Мысль - искать строки содержащие 'gif' и делать логическое отрицание. Но как это сделать тоже не знаю. В общем прошу помощи.

Искать тоже пытался. Но это трудно, потому что тем по регулярным выражениям много. И выискать среди них, то что нужно, сложно.
 

KolyaA

Новичок
PHP:
if(!preg_match("# 'gif' #xs", $str) { 

}
Смысл вопроса в том чтобы, написать используя только синтаксис регулярных выражений :confused:
 

KolyaA

Новичок
PHP:
if(!preg_match("# 'gif' #xs", $str) {  

}
А то, что вам написали это какой синтаксис ?
В том, что написал Исеман используется пхп. У него написано регулярное выражение, которое ищет строки, в которых есть 'gif'. Потом с помощью пхпшной операции '!' проверяется истинность результата поиска. Нужно же, регулярное выражение, которое бы сразу давало строки, в которых нет 'gif'. Понятно?
 

Страшный Злодей

Бывший член клуба (достало хамство).
KolyaA
да, главное чтобы вам самому это понятно было...
Нужно же, регулярное выражение, которое бы сразу давало строки, в которых нет 'gif'.
про такую конструкцию в регулярных выражениях слыхали: "[^ ... ] " ?

"[^" начинает "исключающее множество символов", который задает любой символ за исключением заданных. Таким образом, шаблон "[^a-z0-9A-Z]" задает любой символ за исключением букв и цифр.
 

Армян

Новичок
Страшный Злодей
а чем это поможет? ему ведь надо невхождение строки определить а не символов
 

KolyaA

Новичок
Объясни где ты это хочешь использовать?
Нужно было написать RewriteRule, то есть правило, которое перенаправляет на другой адрес, при введении пути в браузере. Вообще я даже нашел решение, которое у меня правда не заработало. :)

^[\w/\%]*(?:\.(?!(?:gif)$)[\w\%]*$)? (и оно проверяет невхождение '.gif' а не 'gif', с учетом того, что в строке есть '.')

Однако посмотрев на это можно предложить решение вроде:написать выражение "(в строке есть вхождение 'g' но за ним не идет 'if') либо (в строке нет 'g' вообще)".

Первая часть будет выглядеть: ^(.*)g(?!(if))(.*)$
Вторая:^[^g]*$

Их еще надо объединить вместе.

В общем я свою задачу решил немного по-другому(написал два RewriteRule). Однако поставленная задача, мне кажется, любопытной сама по себе. Просто вчера потратил на нее почти целый день, сейчас уже больше не могу тратить на это время.

Страшный Злодей
Без обид, но мне нужно невхождение строки, а не символа. Мне кажется с помощью [^] этого не сделать. Если туплю - подскажи.
 

Lews

Новичок
Т.е. нужно перенаправлять куда-то, если там нет .gif?
 

Страшный Злодей

Бывший член клуба (достало хамство).
monomer
Если я ему файл отправлю, Mygiffile.jpg
'/(.+)\.(gif)$/'

Армян
ему ведь надо невхождение строки определить а не символов
но строку ведь не обязательно искать целиком ;)
'/(.+)\.([^gG])([a-zA-Z]){2}$/'
подойдёт, в случае, если в папке лежат только файлы основных форматов *.gif, *.jpg, *.png

KolyaA
Мысль - искать строки содержащие 'gif' и делать логическое отрицание
вариант '/(.+)\.(gif)$/' чем не устраивает?
 

prolis

Новичок
Тогда сначала правило преправить всё +продолжить
Второе правило на наличие гиф +остановиться
 

KolyaA

Новичок
ну так и нужно было с этого начинать, тогда в помощь "!(pattern)"
Я что-то неуверен, что в PCRE есть токая конструкция как "!(pattern)" . Если это действительно так, то все достаточно просто. Можете кинуть ссылку, где про это написано?
 
Сверху