Strict Standards: Resource ID#18 used as offset, casting to integer (18) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401

Strict Standards: Resource ID#23 used as offset, casting to integer (23) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401

Strict Standards: Resource ID#25 used as offset, casting to integer (25) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401

Strict Standards: Resource ID#26 used as offset, casting to integer (26) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401
ТвойWeb :: Функция preg_replace()
ТвойWeb ТвойWeb
Качественный Европейский хостинг
Форум для чайников
 Чат на форуме      Помощь      Поиск      Пользователи


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

> Описание: Как заменить слово с окончанием?
Alone
Отправлено: 18 Февраля, 2007 - 01:16:53
Post Id



Super Member


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

Карма 8




К примеру есть такой код:

CODE:

$pattern = array( '#струя#');
$replace = array( '<a href=http://tvoyweb.ru>струя</a>' );
$text = preg_replace($pattern, $replace, $text);


Он строго меняет "струя" на "струя" (превращая в ссылку).

Проблема в том, что все слова, включающие в себя слово "струя" (например: струящийся, струящиеся, стрящаяся...) превраящаются в ссылку не полностью.
То есть так:
струящийся
струящиеся
струящаяся

Как сделать так, чтобы эта функция работала в отношении полностью всего целого слова по введённому началу и чтобы в ссылку подставлялось слово которое полное (с окончанием)?

По идее работает такой вариант:
CODE:

$pattern = array( '#струя*[А-я]#ie');
$replace = array( '<a href=http://tvoyweb.ru>струя</a>' );
$text = preg_replace($pattern, $replace, $text);

Но при этом варианте например слово "струящийся" превращается в ссылку из слова струя, а надо чтобы в ссылку из слова струящийся

На примерах видел что-то типа этого:
CODE:

$pattern = array( '#струя*[А-я]#ie');
$replace = array( '<a href=http://tvoyweb.ru>$1</a>' );
$text = preg_replace($pattern, $replace, $text);


Но точно не пойму как сделать...
Вот такая головоломка Улыбка

(Отредактировано автором: 18 Февраля, 2007 - 01:19:53)

 
 Top
Леголегс Администратор
Отправлено: 18 Февраля, 2007 - 03:56:14
Post Id



JS-маньяк


Покинул форум
Сообщений всего: 2109
Дата рег-ции: Июль 2004  
Откуда: Липецк

Карма 17




Alone
Текст для сохранения переменной бери в скобки
CODE:
$pattern = array( '#(струя*[А-я])#ie');
$replace = array( '<a href=http://tvoyweb.ru>$1</a>' );
$text = preg_replace($pattern, $replace, $text);

Ещё вроде должно работать так:
CODE:
$pattern = array( '#(струя*[А-я])#ie');
$replace = array( '<a href=http://tvoyweb.ru>$0</a>' );
$text = preg_replace($pattern, $replace, $text);

(Добавление)
Alone
Подожди, я не понял. С каких пор струя*[А-я] а не струя[А-я]*??? Я что-то пропустил?
 
 Top
Alone
Отправлено: 18 Февраля, 2007 - 04:48:16
Post Id



Super Member


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

Карма 8




Леголегс пишет:
Подожди, я не понял. С каких пор струя*[А-я] а не струя[А-я]*??? Я что-то пропустил?

Блин, в этом было дело Улыбка
(Добавление)
Что-то не пойму как прикрутить здесь функцию str_replace()
???

То есть нужно чтобы при варианте:

CODE:
$pattern = array( '#(струя[А-я])*#');
$replace = array( '<a href=http://tvoyweb.ru>$0</a>' );
$text = preg_replace($pattern, $replace, $text);


Ссылкой становились сразу два слова с маленькой и с большой буквы: Струя и струя
 
 Top
Леголегс Администратор
Отправлено: 18 Февраля, 2007 - 07:19:55
Post Id



JS-маньяк


Покинул форум
Сообщений всего: 2109
Дата рег-ции: Июль 2004  
Откуда: Липецк

Карма 17




Alone
Что-то ты совсем ничего не понял как я поглажу. Правильный вариант примерно таков:
CODE:
$pattern = array( '#струя[а-я]*#i');
$replace = array( '<a href=http://tvoyweb.ru>$0</a>' );
$text = preg_replace($pattern, $replace, $text);

Поясняю: звёздочка ставится после элемента, который может повторяться. Она ставится после я-а т.к. имеется ввиду произвольное количество букв из этого диапазона. Если ставить звёздочку после скобки, то будут совпадать только слова типа струяа струяаструяб струяаструябструял, т.е. струя, одна буква и так сколько угодно раз. Скобочки, помимо объединяющего действия (как в арифметике), запоминают часть совпавшего слова в $1,$2 и т.д. В $0 всегда весь совпавший текст (вообще $0 может и не быть, зависит от реализации, не помню точно что там в PHP, могу ошибиться, тогда дорисуешь скобки и заюзаешь $1). "i"после решётки как раз и означает нечувствительность к регистру.
 
 Top
Alone
Отправлено: 18 Февраля, 2007 - 07:40:27
Post Id



Super Member


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

Карма 8




Леголегс
Ага, сенкс Улыбка
 
 Top
Alone
Отправлено: 19 Февраля, 2007 - 11:41:20
Post Id



Super Member


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

Карма 8




Ещё вопросик, терь уже не про окончание а про начало:

Нужно чтобы то что перд заменяемым словом превращалось в ссылку.
Я делаю так:
CODE:
$pattern = array( '#*[А-я]струя[а-я]*#i');
$replace = array( '<a href=http://tvoyweb.ru>$0</a>' );
$text = preg_replace($pattern, $replace, $text);

Но так не работает.
Делаю так:
CODE:
$pattern = array( '#[А-я]*струя[а-я]*#i');
$replace = array( '<a href=http://tvoyweb.ru>$0</a>' );
$text = preg_replace($pattern, $replace, $text);

Так работает, но почему-то символ « тоже превращается в ссылку вместе со всем словом.
Например так:
«переструящийся
А надо чтобы было так: «переструящийся
(Добавление)
А все другие буквы нормально.
Только этот символ: «
 
 Top
TvoyWeb Администратор
Отправлено: 20 Февраля, 2007 - 00:35:50
Post Id



Главный здесь


Покинул форум
Сообщений всего: 7072
Дата рег-ции: Нояб. 2003  
Откуда: Tashkent Uz

Карма 52




CODE:
preg_replace("#([А-я]*струя[а-я]*)#i","<a href=http://tvoyweb.ru>$1</a>",$text)
 
 Top
Alone
Отправлено: 20 Февраля, 2007 - 03:17:48
Post Id



Super Member


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

Карма 8




TvoyWeb
Так тоже делал, не помогает...
Все буквы и другие символы нормально и классно, а этот « становится продолжением слова (ссылки).
То есть вот так «перестрящийся»
Он почему-то считается буквой
Все остальные варианты типа (перестрящийся) (стрящийся) превращаются как нужно, так:
(перестрящийся) (стрящийся)

Наверно фиг с ним с этими кавычками, впринципе редко встречаются...

-----------
Ещё вопрос:

Вот например на форуме юзер уже создал ссылку с предложением типа:

Эта струя самая обалденная струя из всех!

Естественно слово "струя" в этой ссылке переделается функцией preg_replace() на ещё одну ссылку и тогда изначальная ссылка "поломается" и одна ссылка вклинится в другую и будет бардак....

Можно ли как-то запретить меняться слову "струя" в уже имеющейся ссылке?
 
 Top
TvoyWeb Администратор
Отправлено: 20 Февраля, 2007 - 03:46:47
Post Id



Главный здесь


Покинул форум
Сообщений всего: 7072
Дата рег-ции: Нояб. 2003  
Откуда: Tashkent Uz

Карма 52




Alone пишет:
Все буквы и другие символы нормально и классно, а этот « становится продолжением слова (ссылки).

Не знаю что у тебя не получается
Вот смотри:
CODE:
$string = 'четыре «перестрящийся четыре';
$string = preg_replace("#([A-Za-z0-9А-Яа-я]*стрящ[A-Za-z0-9А-Яа-я]*)#is","<a href=\"\">$1</a>", $string);
echo $string;

$string = '<br>Новая «струящаяся» "струя" без ссылки <a href="http://tvoyweb.ru">Эта струя самая обалденная струя из всех!</a>';
$string = preg_replace("#([A-Za-z0-9А-Яа-я]*струя[A-Za-z0-9А-Яа-я]*)(?=[^<>]*(?!</)(?:<|$))#is","<a href=\"\">$1</a>", $string);
echo $string;
 
 Top
Alone
Отправлено: 20 Февраля, 2007 - 05:16:49
Post Id



Super Member


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

Карма 8




TvoyWeb
Идеально !
То что нужно и всё заработало (включая проблему с символом «)
Улыбка
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 2 (гостей: 2, зарегистрированных: 0, скрытых: 0)
« PHP/Perl »


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



Форум на AlfaSpace.NET


Powered by ExBB
ExBB FM 1.0 RC1 by TvoyWeb.ru
InvisionExBB Style converted by Markus®

[Script Execution time: 0.0499]     [ Gzipped ]



Notice: ob_end_flush(): failed to send buffer of ob_gzhandler (1) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/page_tail.php on line 33