Регулярное выражение: "Всё_кроме_последовательности"

Nimous

Guest
Регулярное выражение: Всё_кроме_последовательности

Собственно, сабж.

Как в регулярных выражениях (preg)
обозначается отрицание последовательности символов.
Т.е. :
любые_символы_кроме_ПОСЛЕДОВАТЕЛЬНОСТИ

Тут где-то обсуждалось, но я не нашёл.
Помогите пожалуйста:)
 

Steamroller

Новичок
Что-то вроде (?!pattern).{длина}
Вообще вот тут: http://www.perl.com/doc/manual/html/pod/perlre.html начиная с (?=pattern) все эти assertions описаны хорошо.
 

Nimous

Guest
Steamroller
Спасибо.

Ссылку читаю. Но по английски я понимаю медленно:), поэтому
один вопросик:
А 'длина' - это что такое?
Т.е. что это такое, я знаю:)
Длина чего?
 

SelenIT

IT-лунатик :)
Здесь, по-моему, тоже не так уж плохо написано, к тому же применительно к PHP и по-русски...
 

Nimous

Guest
Gas
Уже пытался так сделать.
Обрисую конкретную задачу:
Код:
$string = 'TERM Search string  not_allowed_stringTERM sdfsfsf TERM';

$reg ="/TERM(.*)(?<!not_allowed_string)TERM/";

preg_match_all($reg,$string,$matches);

echo "<pre>" ; print_r($matches); echo "</pre>";
TERM - это ограничители блока.
Нужно получить все символы между ними, но:
Если перед последовательностью TERM находится последовательность not_allowed_string,
то ограничитель таковым не считается.

Что-то у меня не выходит...
 

Gas

может по одной?
Попробуй такой рег:

PHP:
$reg ="/TERM(.*)(?<!not_allowed_string)(?=TERM)/U";
 

Steamroller

Новичок
Автор оригинала: Nimous
Steamroller
Спасибо.

Ссылку читаю. Но по английски я понимаю медленно:), поэтому
один вопросик:

А 'длина' - это что такое?
Т.е. что это такое, я знаю:)
Длина чего?
Длина последовательности, которую "отрицаешь".
То есть если текстом описать то: место, после которого идет сколько-то символов, не совпадающих с шаблоном.
Но в твоем случае действительно надо через (?<!.....).
 

Nimous

Guest
Gas
Ага. То что нужно.
Спасибо тебе.

Только всё же непонятно, почему без (?=TERM) не работало.
 

Steamroller

Новичок
Автор оригинала: Nimous

Только всё же непонятно, почему без (?=TERM) не работало.
А у меня твой пример сработал...
(
[0] => Array
(
[0] => TERM Search string not_allowed_stringTERM sdfsfsf TERM
)

[1] => Array
(
[0] => Search string not_allowed_stringTERM sdfsfsf
)

)
 

Nimous

Guest
Steamroller
Search string not_allowed_stringTERM sdfsfsf
-Это находится замечательно.
Но проблема была в том, что:
Search string TERM sdfsfsf
также проходило.
Т.е. экран ограничителя не работал.

В любом случае конкретная проблема решена, за что всем огромное спасибо.
Разве что в догонку темы ещё один вопрос.

Нет ли у кого ссылок на примеры по assertions.
Для лучшего усвоения материала:)
 

SelenIT

IT-лунатик :)
Nimous
По-моему, в примере Gasа решающую роль сыграла не замена TERM на (?=TERM), а модификатор U...
 

Gas

может по одной?
SelenIT
на самом деле (?=TERM) тоже нужен, чтоб позиция конечного TERM не "запоминалась". Иначе проглатываться будет каждый второй результат.
 
Сверху