Вопрос по регулярным выражениям

12
mfl
На сайте с 16.10.2006
Offline
134
mfl
1050

preg_replace ("~[^tex]~", "", "ishodnaya tex stroka tex"); // удаляет из строки все символы кроме "t", "e" и "x"

Как правильно составить паттерн, чтобы удалялись не отдельно символы кроме перечисленных, а удалялось все кроме последовательности этих символов "tex"?

Dreammaker
На сайте с 20.04.2006
Offline
569
#1


$text = ( strpos( 'ishodnaya tex stroka tex', 'tex') === FALSE) ? '' : 'tex';

я так понимаю вам нужно получить 'tex', если он присутствует в строке? или нужно получить все вхождения 'tex'?

mfl
На сайте с 16.10.2006
Offline
134
mfl
#2

Нет, мне необходим именно паттерн

Я понимаю, то что привел в примере может реализовыватся и другими способами, примеров может быть много.

[^tex] - это любой символ кроме "t", "e" и "x"

паттерн, который интересует - это любая последовательность символов, кроме "tex"

Вот еще пример:

$text=preg_replace('~<a[^>]*href=.?http.?://[^>]*>([^</a]*)</a>~i','$1', $text);

Удаление ссылок.

[^</a] - любой символ кроме "<", "/" и "a"

это работает, когда в качестве ссылки только текст, а если там картинка или BB-коды, паттерн не подойдет

Dreammaker
На сайте с 20.04.2006
Offline
569
#3

насколько хватает моих знаний в регулярках насколько я понимаю задачу, то она неразрешима. Через регулярные выражения нельзя получить последовательность, которой нет :)

Опишите задачу полностью, а не ваш вариант её решения и может быть получится вам помочь :)

YuraZ
На сайте с 05.06.2006
Offline
95
#4

паттерн, который интересует - это любая последовательность символов, кроме "tex"

если я правильно понял, то:

/(?!abc)(def)/i - захватит строку 'def', перед которой нет строки 'abc'

add: похоже неправильно я понял :D

Dreammaker
На сайте с 20.04.2006
Offline
569
#5
YuraZ:
паттерн, который интересует - это любая последовательность символов, кроме "tex"

Это не задача - это ваш вариант решения. В общем, ладно, когда решите напишите решение - я так понимаю помощь вам не нужна.

YuraZ
На сайте с 05.06.2006
Offline
95
#6

Лично мне помощь не нужна, наставления тем более :) Я вообще мимо проходил :D

ТС писал:


[^tex] - это любой символ кроме "t", "e" и "x"
паттерн, который интересует - это любая последовательность символов, кроме "tex"

Я написал относительно в тему(?), что отрицать строку в регэкспах можно конструкцией (?!str) На этом мысль оборвалась :)

Dreammaker
На сайте с 20.04.2006
Offline
569
#7
YuraZ:
Лично мне помощь не нужна, наставления тем более

Сорри, промазал :)

update: аж, стыдно стало, нипрочто человека обидел :)

Dweep
На сайте с 11.12.2006
Offline
207
#8

Такое устраивает ?

preg_match_all("(tex)", "ishodnaya tex stroka tex", $out);

echo implode($out[0]);

mfl
На сайте с 16.10.2006
Offline
134
mfl
#9

Спасибо всем за ответы.

Опишите задачу полностью, а не ваш вариант её решения и может быть получится вам помочь

Конкретной задачи нет, просто в работе довольно часто с такими выражениями сталкиваюсь (когда необходимо обрабатать только ту часть строки, которая не содержит определенную последовательность символов), и все время приходится решать задачу используя обходные пути, для каждого слачая свои. А при наличии такого паттерна все решалось бы одной строкой.

/(?!abc)(def)/i - захватит строку 'def', перед которой нет строки 'abc'

Спасибо, сейчас копаю в этом направлении, что то типа ((?!abc).)*

preg_match_all("(tex)", "ishodnaya tex stroka tex", $out);
echo implode($out[0]);

Это тоже один из вариантов решения конкретного примера

его даже лучше на строковых функциях реализовать.

В случае с

$text=preg_replace('~<a[^>]*href=.?http.?://[^>]*>([^</a]*)</a>~i','$1', $text); 
он уже безполезен
Dreammaker
На сайте с 20.04.2006
Offline
569
#10
mfl:
что то типа ((?!abc).)*

насколько я помню, в такого типа паттернах нужно указывать какой длины будет идти следующее за условием совпадение, так что в данном случае может не помочь. Но могу ошибаться именно в этом месте у меня в знаниях пробел.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий