Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Тексты > Заменить обособленное слово


Автор: Aliance 13.10.2008, 19:14
У меня есть регулярка, замняющее слово test на другое определенное слово.
Код

$re = "|test|";

Но как сделать так, чтобы оно работало только если:
  • с обоих концов слова пробелы
  • с обоих концов слова начало и конец строки соответственно
  • всевозможные комбинации первых двух пунктов
Пробовал так:
Код

$re = "|[\s^]test[\s$]|";

Но не работает. Подскажите.

Автор: Sunvas 13.10.2008, 19:52
Цитата(Aliance @  13.10.2008,  19:14 Найти цитируемый пост)

с обоих концов слова пробелы
с обоих концов слова начало и конец строки соответственно

По одному:
Код

'#(?<\s)test(?\s)#'
'#^test$#'


А вот комбинации, думаю лучше сделать "скрестив" оба варианта.

Автор: Aliance 13.10.2008, 20:00
По одному не подходит, иначе замена будет два раза происходить

Автор: skyboy 13.10.2008, 20:48
а разве вариант с "множественным выбором" не работает?
Код

(^|\s)test($|\s)

уж не уверен наверняка, что именно в PHP, но где-то подобный финт точно работает!

Автор: Aliance 13.10.2008, 20:55
Цитата(skyboy @  13.10.2008,  21:48 Найти цитируемый пост)
а разве вариант с "множественным выбором" не работает?

модификатор m? Он стоит.

Цитата(skyboy @  13.10.2008,  21:48 Найти цитируемый пост)
(^|\s)test($|\s)

попробую, сообщу.

Автор: skyboy 13.10.2008, 22:07
Цитата(Aliance @  13.10.2008,  19:55 Найти цитируемый пост)
модификатор m? Он стоит.

Хм. А конструкция 
Код

(variant1|variant2|variant3...)

как называется "по-правильному"? я именно это выбором называю..

Автор: sTa1kEr 14.10.2008, 00:09
Aliance, может быть вам нужно прсто заменить слово целиком? Тогда так проще:
Код

$re = "/\btest\b/";

Если же именно пробелы и начало/окончание строк должны идти, то почти как сказал skyboy, только нужно использовать утверждения, иначе будт так-же заменятся пробелы и не будут заменятся лова идущие подряд (к примеру " test test ")
Код

$re = "/(?<=\s|^)test(?=\s|$)/";

Автор: unicross 14.10.2008, 21:05
sTa1kEr, отлично придумано!

Единственно если встерятся символы [,.?!] шаблон работать не будет. Предлагаю немного дополнить

Код

$re = "/(?<=\s|^)test(?=\s|$|[,.?!])/";


Код

$string = "test test, test\ntest! test? test. test1 test";
$pattern = "/(?<=\s|^)test(?=\s|$)/";
$replacement = "$1slon$2";
echo preg_replace($pattern, $replacement, $string);

echo "<BR>";

$string = "test test, test\ntest! test? test. test1 test";
$pattern = "/(?<=\s|^)test(?=\s|$|[,.?!])/";
$replacement = "$1slon$2";
echo preg_replace($pattern, $replacement, $string);


Выведет

Код

slon test, slon test! test? test. test1 slon
slon slon, slon slon! slon? slon. test1 slon

Автор: SelenIT 16.10.2008, 01:16
Цитата(skyboy @  13.10.2008,  22:07 Найти цитируемый пост)
как называется "по-правильному"?

..."альтернатива"?  smile 

Цитата(Aliance @  13.10.2008,  20:55 Найти цитируемый пост)
модификатор m? Он стоит.

А смысл, в данной задаче? Перевод строки ведь и так учитывается в \s...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)