Повторный выбор по шаблону

usascha

Новичок
Повторный выбор по шаблону

Вот этот код прекрасно работает, но с одним изъяном.

PHP:
$patt = array ("образованием", 
	"образовании",
	"образованию",
	"образование",
	"образования");

$repl = array ("<font ... underline>образованием</font>",
"<font ... underline>образовании</font>",
"<font ... underline>образованию</font>",
"<font ... underline>образование</font>",
"<font ... underline>образования</font>");

print str_replace($patt,$repl, $t_result['text']);
Косяк в том, что если встречается слово "образованием", то оно подчеркивается дважды. Как этого избежать?
 

usascha

Новичок
Автор оригинала: Profic
[m]strtr[/m] - вариант вызова с массивом
Спасибо. одна проблема решена. Правда, таже проблема, но с другой стороны :( проявилась. Теперь подсвечивается часть слова "образование" в слове, например, "ценообразование".
Смысл в том, чтобы подсвечивать только конкретные слова целиком, а не части как искомые вхождения. Мне нужны только конкретные слова.
 

uchenik

Новичок
Автор оригинала: usascha
Смысл в том, чтобы подсвечивать только конкретные слова целиком, а не части как искомые вхождения. Мне нужны только конкретные слова.
Для проблем такого рода нужно использовать "регулярные выражения" в паре с функцией preg_replace(), которая аналогична str_replace().

-~{}~ 20.11.04 03:51:

Для твоего примера:

$patt = array ("'^образованием$'",
"'^образовании$'",
"'^образованию$'",
"'^образование$'",
"'^образования$'");

$repl = array ("<font ... underline>образованием</font>",
"<font ... underline>образовании</font>",
"<font ... underline>образованию</font>",
"<font ... underline>образование</font>",
"<font ... underline>образования</font>");

print preg_replace($patt, $repl, $t_result['text']);


Важно! - в массиве $patt внутри двойных кавычек стоит еще пара одинарных: " ' ' "
 

usascha

Новичок
я полностью повторил код, учел все кавычки, но не делает подчеркивание.
Убрал реги и стал подчеркивать, но со старой проблемой - дважды.

версия php 4.3.3.
 

Profic

just Profic (PHP5 BetaTeam)
uchenik
Мдя чтобы такое написать, имхо нужно упасть откуда-нить повыше :) Например с луны :)

usascha
тебе нужно
1) [m]preg_replace[/m]()
2) в качестве регулярки используешь что-то похожее на
~\b(слово1|слово2|...)\b~
как сделать сам додумаешься?
3) в качестве замены <font ... underline>\1</font>
4) ну и конечно прочитать то, что написано в посте SiMM-а
 

usascha

Новичок
SiMM
Я прочитал ссылки, в принципе такое руководство я уже читал в красной книжке с 5 головами. Полезно, но не ново.

Как я уже написал, проблема в том, что если убрать регулярные выражения, то все срабатывает... и в том варианте, который дал uchenik.

Получается, что именно в самих выражениях и проблема.
Если разобрать '^образованием$', то смысл выражения: совпадение уникальной последовательности литер "о" "б" "р" "а" "з" "о" "в" "а" "н" "и" "е" "м". При этом последовательность начинается с литеры "о" и заканчивается "м".

Раз замена не производится, то это значит, что именно такой последовательности нет в массиве $t_result['text'] !? Но ведь без регов все находит. Ошибочно только то, что находит дважды.
Profic
что Вы предожили - вариант. Я и использую preg_replace/ Но срока для замены у меня очень длинная - более 160 символов. Читать неудобно.

Может тут должно быть сочетание preg_replace и напр., strtr или какой-то другой функции. Я попробовал, но у меня не получилось...
 

uchenik

Новичок
Извените, чуть-чуть ошибся - если просто вызвать функцию preg_replace(), то она замены сделает но не сохранит их в массив $t_result['text'].

Правильно конечно же так:

$t_result['text'] = preg_replace($patt, $repl, $t_result['text']);

-~{}~ 21.11.04 17:16:

Автор оригинала: uchenik
Извените, чуть-чуть ошибся - если просто вызвать функцию preg_replace(), то она замены сделает но не сохранит их в массив $t_result['text'].

Правильно конечно же так:

$t_result['text'] = preg_replace($patt, $repl, $t_result['text']);
Кароче пример:

$patt = array ("'\bобразованием\b'",
"'\bобразовании\b'",
"'\bобразованию\b'",
"'\bобразование\b'",
"'\bобразования\b'");

$t_result['text'] = array ("человек обделен образованием",
"виновен в образовании",
"образованию",
"высшее образование",
"у него нет образования");

$repl = array ("<u>образованием</u>",
"<u>образовании</u>",
"<u>образованию</u>",
"<u>образование</u>",
"<u>образования</u>");

$t_result['text'] = preg_replace($patt, $repl, $t_result['text']);

Все прекрасно работает.
 
Сверху