Реги, требуется уточнение синтаксиса.

jeka!

Просто Member
Реги, требуется уточнение синтаксиса.

Дело вот в чём, сами регулярные выражения я можно сказать изучил, и хорошо справляюсь с самим построением, но нигде не могу найти информацию об этом:

Допустим
PHP:
preg_match("/text\\<a[^>]+\\>text/i",$in);
тут используется два слэша в которых заключена рега,
и мне пришлось экранировать знаки >
PHP:
preg_match("|text<a[^>]+>text|i",$in);
А так я уже ничего не экранирую,
использовано 2 прямых черты.

Но я встречал реги заключенные в !рега!, ~рега~, и возможно ещё есть варианты.

Подскажите что даёт использование этих вариантов, или ссылку на соответствующию статью.
В мануале этого не описано.
 

Alex-AKF

Guest
Если я не ошибаюсь, в мане сказано, что regexp могут обрамлять ЛЮБЫЕ символы, не встречающиеся в самом выражении. Причём абсолютно любые. Хоть +\w*+i
 

jeka!

Просто Member
Автор оригинала: Alex-AKF
Если я не ошибаюсь, в мане сказано, что regexp могут обрамлять ЛЮБЫЕ символы, не встречающиеся в самом выражении. Причём абсолютно любые. Хоть +\w*+i
Странно, ну а суть то в чём, я же говорю, в одном случае мне приходится экранировать символы, такие как =,>,< и т.д.
А в другом, мне этого не надо делать, вот и хочу разобраться как надо экранировать.
 

Alex-AKF

Guest
Экранировать? Хм...Если я не ошибаюсь символы <>= не явлются управляющими символами регекспов. Не являются он также и esc-последовательностями. Я не вижу смысла их "экранировать". (Открой хотя бы манку PHP - там к preg_***примеры и в них никто ничего не экранирует)

а различное обрамление мне нужно что бы использовать любые символы в регэкспе:
!abcd! - ОК. Если мне надо abcd!asd то ~abcd!asd~ например. Вот и всё.
 

jeka!

Просто Member
Терь ясно, но при использовании например такой реги
preg_match_all("!<a[^>]+href=\"([^\"'>\s]+)\"[^>]*>.*?</a>!is",$file,$out);
экранировать придётся, если регу заключешь в //
 

Alex-AKF

Guest
"экранировать придётся, если регу заключешь в // "
Вопрос не совсем ясен.
 

.des.

Поставил пиво кому надо ;-)
Alex-AKF
The special regular expression characters are: . \\ + * ? [ ^ ] $ ( ) { } = ! < > | :

вообще взгляни на результат работы функции [m]preg_quote[/m]. она очень много чего экранирует ;)
 

Little

Guest
А вот такой вопрос:

допустим мне надо в регах проверять на наличие символа \

как мне его писать?

"/\\/" или "/\\\\/" ?

вообще зависит от того в каких кавычках паттерн в " или в '
и если зависит, то сам пхп не "разыменовывает" ли строчку (читай делает стрипслэшез) а потом скармливает энжину.

т.е. "/\\\\/" == '/\\/' ?

короче нифига не ясны правила экранирования, т.к. очень долго писал на перле то порой регулярки в пхп (preg_) приходится добивать эмпирически, подбирая нужное количество \ пока не заработает как надо...
 

si

Administrator
приходится добивать эмпирически, подбирая нужное количество \ пока не заработает как надо...
Надо один раз понять что экранируется на уровне строк в РНР и что в самих регах.
 

Venom

Guest
Одно скажу - в каких кавычках рег стоит - зависит, потому что в одинарных тебе придется проэскейпить все один раз, а в двойных - проэскейпить ескейпы, которые были записаны, чтобы проэскейпить эскейпы нужных символов, потому что сам знак эскейпирования - \ - придется проэскейпить.
Вот!
 
Сверху