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

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

Strict Standards: Resource ID#37 used as offset, casting to integer (37) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401
ТвойWeb :: Версия для печати :: Функция preg_replace()
ТвойWeb » WebMaster класс » PHP/Perl » Функция preg_replace()

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

1. Alone - 18 Февраля, 2007 - 01:16:53 - перейти к сообщению
К примеру есть такой код:

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);


Но точно не пойму как сделать...
Вот такая головоломка Улыбка
2. Леголегс - 18 Февраля, 2007 - 03:56:14 - перейти к сообщению
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
Подожди, я не понял. С каких пор струя*[А-я] а не струя[А-я]*??? Я что-то пропустил?
3. Alone - 18 Февраля, 2007 - 04:48:16 - перейти к сообщению
Леголегс пишет:
Подожди, я не понял. С каких пор струя*[А-я] а не струя[А-я]*??? Я что-то пропустил?

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

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

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


Ссылкой становились сразу два слова с маленькой и с большой буквы: Струя и струя
4. Леголегс - 18 Февраля, 2007 - 07:19:55 - перейти к сообщению
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"после решётки как раз и означает нечувствительность к регистру.
5. Alone - 18 Февраля, 2007 - 07:40:27 - перейти к сообщению
Леголегс
Ага, сенкс Улыбка
6. Alone - 19 Февраля, 2007 - 11:41:20 - перейти к сообщению
Ещё вопросик, терь уже не про окончание а про начало:

Нужно чтобы то что перд заменяемым словом превращалось в ссылку.
Я делаю так:
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);

Так работает, но почему-то символ « тоже превращается в ссылку вместе со всем словом.
Например так:
«переструящийся
А надо чтобы было так: «переструящийся
(Добавление)
А все другие буквы нормально.
Только этот символ: «
7. TvoyWeb - 20 Февраля, 2007 - 00:35:50 - перейти к сообщению
CODE:
preg_replace("#([А-я]*струя[а-я]*)#i","<a href=http://tvoyweb.ru>$1</a>",$text)
8. Alone - 20 Февраля, 2007 - 03:17:48 - перейти к сообщению
TvoyWeb
Так тоже делал, не помогает...
Все буквы и другие символы нормально и классно, а этот « становится продолжением слова (ссылки).
То есть вот так «перестрящийся»
Он почему-то считается буквой
Все остальные варианты типа (перестрящийся) (стрящийся) превращаются как нужно, так:
(перестрящийся) (стрящийся)

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

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

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

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

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

Можно ли как-то запретить меняться слову "струя" в уже имеющейся ссылке?
9. TvoyWeb - 20 Февраля, 2007 - 03:46:47 - перейти к сообщению
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;
10. Alone - 20 Февраля, 2007 - 05:16:49 - перейти к сообщению
TvoyWeb
Идеально !
То что нужно и всё заработало (включая проблему с символом «)
Улыбка

Форум на AlfaSpace.NET


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

[Script Execution time: 0.0473]     [ 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