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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Замена слова между пробелами/началом или концом строки

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
voodoo_dn
Отправлено: 09 Января, 2014 - 15:08:04
Post Id


Новичок


Покинул форум
Сообщений всего: 12
Дата рег-ции: Янв. 2014  


Помог: 0 раз(а)




Добрый день!

Интересует регулярка, которая будет заменять нужное мне слово, которое находится между пробелами, или находится в начале строки или в конце.
Написал вот такую вещь: /[\s|\A|\Z](#blog)[\s|\A|\Z]/ - но съедает пробелы =/

Помогите разобраться. Спасибо.

Да и вообще, возможно ли это? Может preg_replace заменяет всё что подходит под шаблон без возможности указания куска?

(Отредактировано автором: 09 Января, 2014 - 15:52:02)

 
 Top
Panoptik
Отправлено: 09 Января, 2014 - 16:57:00
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




вы бы лучше написали 2 строки в виде примера: что есть и что хочется, а то что вы описали и подтвердили своей регуляркой вряд ли кто-то поймет


-----
Just do it
 
 Top
DlTA
Отправлено: 09 Января, 2014 - 16:58:58
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




/\bслово\b/

(Отредактировано автором: 09 Января, 2014 - 17:03:00)

 
 Top
voodoo_dn
Отправлено: 09 Января, 2014 - 17:05:26
Post Id


Новичок


Покинул форум
Сообщений всего: 12
Дата рег-ции: Янв. 2014  


Помог: 0 раз(а)




Panoptik,

к примеру есть строка: #сегодня ночью #лил дождь очень #сильно
теги #сегодня, #лил, #сильно надо заменить на что нибудь другое, например tag1, tag2, tag3.

Т.е. должно получится: tag1 ночью tag2 дождь очень tag3
Но у меня получается: tag1ночьюtag2дождь оченьtag3

Но, дело в том, что поиск должен проходить так: если перед словом есть пробел, или это начало строки и после слова есть пробел или это конец строки, и слово соответствует искомому, то произвести замену.
Т.е. чтоб не было такого, что я заменяю #магазин, а мне цепляет слово #магазины и получается что-то вроде tag1ы.

Я просто не могу найти решение в одной регулярке, чтобы заменило моё слово по заданному пробелу и не сожрало пробелы.
 
 Top
IllusionMH
Отправлено: 09 Января, 2014 - 17:16:37
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


Помог: 242 раз(а)




voodoo_dn, ну можно попробовать банально так
http://codepad[dot]org/IiotY32D
но тут тогда если ставить точку в конце предложения или знак препинания тоже не будет меняться.
 
 Top
Deonis
Отправлено: 09 Января, 2014 - 17:29:05
Post Id



Посетитель


Покинул форум
Сообщений всего: 298
Дата рег-ции: Нояб. 2009  


Помог: 14 раз(а)




Попробуйте такой вариант:
PHP:
скопировать код в буфер обмена
  1. echo preg_replace('/(?<=^|\s)(#blog)(?=\s|$)/','tag',$str);
 
 Top
voodoo_dn
Отправлено: 09 Января, 2014 - 17:35:37
Post Id


Новичок


Покинул форум
Сообщений всего: 12
Дата рег-ции: Янв. 2014  


Помог: 0 раз(а)




IllusionMH пишет:
voodoo_dn, ну можно попробовать банально так
http://codepad[dot]org/IiotY32D
но тут тогда если ставить точку в конце предложения или знак препинания тоже не будет меняться.

Спасибо, Ваш пример помог разобраться. На вскидку, всё работает, щас буду тестить. Выглядит так: /(^|\s|\A|\Z)(#сильно)($|\s|\A|\Z)/, ну и '$1'.'afadfdafadf'.'$3'.
 
 Top
IllusionMH
Отправлено: 09 Января, 2014 - 17:43:19
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


Помог: 242 раз(а)




voodoo_dn, только если первый символ замены - цифра будут проблемы.
Сейчас нашел как правильно экранировать
Цитата:
воспользоваться конструкцией \${1}1, использующей изолированную ссылку $1, и следующую за ней цифру 1.

ну и в конце нужно разобраться со знаками препинания.

О выше написали более правильный вариант. Вечно забываю синтаксис lookahead и lookbehind

(Отредактировано автором: 09 Января, 2014 - 17:53:40)

 
 Top
duhon
Отправлено: 10 Января, 2014 - 11:35:17
Post Id



Гость


Покинул форум
Сообщений всего: 72
Дата рег-ции: Нояб. 2011  


Помог: 5 раз(а)




помоему все просто
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $variants = array(
  3.   'text #var',
  4.   '#bar text',
  5.   'text #blog text',
  6.   'text#blog',
  7.   'text #blogs',
  8.   '#blog 1',
  9.   'text #blogs text',
  10.   "multi lines\n#blog text",
  11.   "multi lines\ntext #blog\ntext",
  12.   'русс#blogрусс'
  13. );
  14. $regs =  array(
  15.   'rav'=>'/\B#var\b/iu',
  16.   'rab'=>'/\B#bar\b/iu',
  17.   'glob'=>'/\B#blog\b/iu'
  18. );
  19. print_r(preg_replace($regs, array_keys($regs), $variants));
  20. //пример для unicode входящей строки, иначе \b для кирилицы не сработает
  21.  
  22. //результат
  23. /*Array
  24. (
  25.     [0] => text rav
  26.     [1] => rab text
  27.     [2] => text glob text
  28.     [3] => text#blog
  29.     [4] => text #blogs
  30.     [5] => glob 1
  31.     [6] => text #blogs text
  32.     [7] => multi lines
  33. glob text
  34.     [8] => multi lines
  35. text glob
  36. text
  37.     [9] => русс#blogрусс
  38. )
  39. */
  40.  

(Отредактировано автором: 10 Января, 2014 - 11:44:49)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Регулярные выражения »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB