Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Знак ~ в регулярном выражении
Форумы портала PHP.SU » PHP » Регулярные выражения » Знак ~ в регулярном выражении

Страниц (2): [1] 2 »
 

1. zypikov - 21 Сентября, 2011 - 10:17:44 - перейти к сообщению
"~[^a-zA-Z0-9_\.-]~"
Что дает знак тильда в этой регулярке?)
2. EuGen - 21 Сентября, 2011 - 10:19:40 - перейти к сообщению
Ничего не делает, это просто разграничитель для PHP - с таким же успехом можно записать
#[^a-zA-Z0-9_\.-]#
или например
@[^a-zA-Z0-9_\.-]@
3. LIME - 21 Сентября, 2011 - 10:27:35 - перейти к сообщению
следует заметить что разграничитель хоть и может быть любым символом(почти)
но следует его экранировать если он встречается внутри регулярки
(Добавление)
классически применяется разграничитель"/"
но часто его заменяют на другой чтобы не экранировать слэши внутри регулярки
4. Росич - 21 Сентября, 2011 - 11:28:10 - перейти к сообщению
Именно поэтому исторически Я практически всегда использую #...# - так как он внутри встречается почти никогда Улыбка .
5. zypikov - 21 Сентября, 2011 - 14:48:56 - перейти к сообщению
спасибо! А то вроде всю документации по регуляркам посмотрел, думаю что за символ такой)
Помогите исчо

bxc2xbeac c2xb wavol c2xb dddeoq - в этой строке нужно найти все c2xb окруженные пробелами, перед которыми точно не идут одной и больше d, и заменить их скажем на "~~~~".

"/(\s)(c2xb)(\s)([^d+])/" - моя регулярка, только "съедает" первую w в первой замене:
bxc2xbeac~~~~avol c2xb dddeoq
6. LIME - 21 Сентября, 2011 - 14:51:58 - перейти к сообщению
zypikov пользуюсь своей загадочной способностью к предвидению и предположу что вы применяет preg_match
посмотрите http://php.su/functions/?preg_match_all
(Добавление)
впредь давайте код или сами думайте
уважайте помошников тем более мы это делаем безвозмездно
7. zypikov - 21 Сентября, 2011 - 17:13:55 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. $text = "bxc2xbeac c2xb wavol c2xb dddeoq";
  2. print preg_replace("/(\s)(c2xb)(\s)([^d+])/i","~~~~",$text);
8. LIME - 21 Сентября, 2011 - 17:22:25 - перейти к сообщению
попробуйте
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $text = "bxc2xbeac c2xb wavol c2xb dddeoq";
  3. echo preg_replace("/[^d]\s+c2xb\s/i","~~~~",$text);
  4. ?>

если в утф то добавьте модификатор u
(Добавление)
исправил
9. zypikov - 22 Сентября, 2011 - 01:56:44 - перейти к сообщению
у меня после выполнения этого скрипта результат такой:
bxc2xbea~~~~wavo~~~~dddeoq
"Съедает" букву перед пробелом Огорчение

LIME а почему без \s без круглых скобок?

Цитата:
тем более мы это делаем безвозмездно

За это вам большой респект!
10. f111 - 22 Сентября, 2011 - 11:11:40 - перейти к сообщению
zypikov пишет:
перед которыми точно не идут одной и больше d
хз о чём речь. в представленной вами строке никакой d не заметил.

Если этот момент не учитывать, то:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $text = "bxc2xbeac c2xb wavol c2xb dddeoq";
  3. echo preg_replace("/\b(c2xb)\b/i","~~~~",$text);
  4. ?>
11. LIME - 22 Сентября, 2011 - 11:33:07 - перейти к сообщению
f111 да
только уберите карман к чему он
а если всеже учитывать тогда усложняется
PHP:
скопировать код в буфер обмена
  1. echo preg_replace("/(?<!d)(?<\s+)c2xb(?=\s+)/i","~~~~",$text);
zypikov пишет:
LIME а почему без \s без круглых скобок?
а зачем в регярках круглые скобки?
тут не надо короче
12. LIME - 22 Сентября, 2011 - 14:01:28 - перейти к сообщению
f111 по условиям границы замены есть пробелы
а границой слова могуть любые символы кроме букв и цифр
(Добавление)
после исправления на "негативный просмотр назад"выдает ошибку
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $text = "bxc2xbeac c2xb wavol c2xb dddeoq";
  3. echo preg_replace("/(?<!d)(?<=\s+)c2xb(?=\s+)/i","~~~~",$text);
  4. ?>
что не так?
(Добавление)
Цитата:

Warning: preg_replace() [function.preg-replace]: Compilation failed: lookbehind assertion is not fixed length at offset 13 in C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\index.php on line 3

(Добавление)
ЧОРД
разобрался
а как сделать позитив назад с неизвестной длинной?
(Добавление)
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $text = "bxc2xbeac c2xb wavol c2xb dddeoq";
  3. echo preg_replace("/(?<!d)(?<=\s)c2xb(?=\s+)/i","~~~~",$text);
  4. ?>
это работает
без + в позитивном просмотре назад
тоесть только 1 пробел смотрит
неизвестную длину нельзя
(Добавление)
и с строкой "bxc2xbeac c2xb wavol c2xb dddeoq xc2xbeacdd c2xb wavold c2xb dddeoq"
вообще не работает
меняет как миленький все
помогите разобраться
спс
(Добавление)
сделал иначе
все работает
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $text = "bxc2xbeac c2xb wavol c2xb dddeoq   xc2xbeacdd c2xb wavold c2xb dddeoq";
  3. echo preg_replace("/(?<!d)(\s+)c2xb(\s+)/i","$1~~~~$2",$text);
  4. ?>
zypikov с вас + в карму Подмигивание
13. f111 - 22 Сентября, 2011 - 17:42:17 - перейти к сообщению
LIME пишет:
только уберите карман к чему он
перечитывая в туалете домашнее чтиво (Джеффри Фридл - регулярные выражения) Радость так и не напоролся на слово карман. Видимо используется в более серьёзных изданиях.

поэтому не могли бы вы пояснить смысл этого слова в данном контексте?
14. LIME - 22 Сентября, 2011 - 19:38:02 - перейти к сообщению
f111 в последней редакции регулярки
первый карман ($1) это (\s+)
он же и второй $2
но это совпадение в данном конкретном случае
Котеров "PHP5 в подлиннике" стр 416
15. f111 - 22 Сентября, 2011 - 21:48:05 - перейти к сообщению
LIME Не понял , в моём РВ нет ни ($1) , ни (\s+), ни $2
(Добавление)
если вы про подшаблон в моём РВ, то почему бы ему и не быть, это не preg_match_all, так что совсем и не мешает

 

Powered by ExBB FM 1.0 RC1