Войти

Показать полную графическую версию : Головоломка с str_replace


venuko
17-01-2009, 20:18
Люди добрые подскажите, плиз, синтаксис php, а то я убьюсь :(

Во что есть:

$out=array("лейкоз","рак");
$from=array("<b>лейкоз</b>","<b>рак</b>");
$text = "лейкоз очень опасная болезнь, она по дамагу даже опережает рак. Рак в свою очередь уже лечиться, раковая опухоль и т.д. Лейкозные и потом опять лейкоз";

$text = str_replace($out,$from,$text);

echo "$text";

Это скрипт выделяет слова тегами <b>, которые я указал в массиве, в чем проблема: Как выделить именно одиночное слово "рак" и "лейкоз" и т.д., в склонениях эту часть одиночного слова не нужно чтобы оно выделялось (это щас происходит, пример "раковая"), и выделялись только первые найденые слова по тексту увиденные скриптом, дальше по тексту выделять слова эти же самые не нужно (слов повторений и их склонений может быть n-количесто)?

Спасибо всем за помощь, я начинающий и поэтому хотел бы увидеть хороший пример, буду очень сильно благодарен!

Igor_I
17-01-2009, 20:42
$out =array ("/лейкоз/","/рак/");

$from =array ("<b>лейкоз</b>","<b>рак</b>");

$text = "лейкоз очень опасная болезнь, она по дамагу даже опережает рак. Рак в свою очередь уже лечиться, раковая опухоль и т.д. Лейкозные и потом опять лейкоз";

$text = preg_replace($out,$from,$text,1);

echo "$text";
Хотя насчет массивов можно сообразить что-либо другое.

venuko
17-01-2009, 20:51
PHP код:
$out =array ("/лейкоз/","/рак/");
$from =array ("<b>лейкоз</b>","<b>рак</b>");
$text = "лейкоз очень опасная болезнь, она по дамагу даже опережает рак. Рак в свою очередь уже лечиться, раковая опухоль и т.д. Лейкозные и потом опять лейкоз";
$text = preg_replace($out,$from,$text,1);
echo "$text";
Хотя насчет массивов можно сообразить что-либо другое. »

Спасибо за помощь, но вот засада, у меня слова и их стили хранятся в БД MySQL, три столбца, первый id поля, поле slovo, поле new_slovo. Так вот как в первый и второй массив соотвественно подгрузить данные из их столбцев?

venuko
17-01-2009, 21:29
$out=array("лейкоз","рак");
$out2=array("<b>лейкоз</b>","<b>рак</a>");
$text = "Лейкоз очень опасная болезнь, она по дамагу даже опережает рак. Рак в свою очередь уже лечиться, раковая опухоль и т.д. Лейкозные и потом опять лейкоз";

for($i = 0; $i<sizeof($out); $i++)
{
$text = substr_replace($text, "<b>".$out2[$i]."</b>", strpos($text,$out[$i]), strlen($out[$i]));
}
echo $text;

Только здесь регистро зависимосимость, первое слово в предложение, а именно Лейкоз не выделяется, выделяется следующие в конце, которое с маленькой буквы.

Как убить регистро зависимость?

Igor_I
17-01-2009, 22:27
C одной стороны, регистронезависимость что-то не получается, с другой стороны она и не нужна, потому как слово Лейкоз будешь менять на слово Лейкоз, опять же с большой буквы.
Спасибо за помощь, но вот засада, у меня слова и их стили хранятся в БД MySQL, три столбца, первый id поля, поле slovo, поле new_slovo. Так вот как в первый и второй массив соотвественно подгрузить данные из их столбцев? »
http://ru2.php.net/manual/ru/function.mysql-query.php
На мой взгляд такой скрипт будет получше.
$slovo = array ("лейкоз","рак");

$out =array ("/$slovo[0]/","/$slovo[1]/");

$from =array ("<b>$slovo[0]</b>","<b>$slovo[1]</b>");

$text = "Лейкоз очень у даже опережает рак. Рак в раковая опухоль и т.д. Лейкозные и потом опять лейкоз";

$text = preg_replace($out,$from,$text);

echo "$text";

venuko
18-01-2009, 09:38
C одной стороны, регистронезависимость что-то не получается, с другой стороны она и не нужна, потому как слово Лейкоз будешь менять на слово Лейкоз, опять же с большой буквы.
Цитата venuko:Спасибо за помощь, но вот засада, у меня слова и их стили хранятся в БД MySQL, три столбца, первый id поля, поле slovo, поле new_slovo. Так вот как в первый и второй массив соотвественно подгрузить данные из их столбцев? »
http://ru2.php.net/manual/ru/function.mysql-query.php
На мой взгляд такой скрипт будет получше.
PHP код:
$slovo = array ("лейкоз","рак");
$out =array ("/$slovo[0]/","/$slovo[1]/");
$from =array ("<b>$slovo[0]</b>","<b>$slovo[1]</b>");
$text = "Лейкоз очень у даже опережает рак. Рак в раковая опухоль и т.д. Лейкозные и потом опять лейкоз";
$text = preg_replace($out,$from,$text);
echo "$text";
------- »


Слова не одиночные выделяются, выделяется ещё часть в склонениях :(

Igor_I
18-01-2009, 14:21
Что-то с русским языком нечего не получается. В английском есть регистронезависимость, в русском (UTF-8) - нет.
Поищи - http://ru2.php.net/manual/ru/function.str-ireplace.php, может что подойдет.

Igor_I
18-01-2009, 14:44
http://phpclub.ru/talk/showthread.php?threadid=110227 - покопайся.

Coutty
18-01-2009, 14:53
Слова не одиночные выделяются, выделяется ещё часть в склонениях »
Добавьте по краям искомого слова пробелы.

Sham
18-01-2009, 19:42
rtm по шаблонам...
$slovo = array ('лейкоз', 'рак');

$out = array
(
'/(?<=\s|^)(' . preg_quote($slovo[0]) . ')(?=\s|$)/i',
'/(?<=\s|^)(' . preg_quote($slovo[1]) . ')(?=\s|$)/i'
);

$from = '<strong>${1}</strong>';

$text = 'Лейкоз очень у даже опережает рак. Рак в раковая опухоль и т.д. Лейкозные и потом опять лейкоз';

$text = @preg_replace($out, $from, $text, 1);

echo $text;

Igor_I
18-01-2009, 19:57
Sham, не знаю как у других, у меня не работает.
Получается такая строка
Лейкоз очень у даже опережает рак. Рак в раковая опухоль и т.д.
Лейкозные и потом опять <strong>лейкоз</strong>
Не люблю регулярки :)

Sham
18-01-2009, 20:28
Igor_I, там железно все, все работает как надо
<strong>Лейкоз</strong> очень у даже опережает рак. <strong>Рак</strong> в раковая опухоль и т.д. Лейкозные и потом опять лейкоз

p.s. первый "рак" не попал, потому что точка в конце (можно в шаблон добавить)

Igor_I
18-01-2009, 20:37
Sham, версия PHP и PCRE?

venuko
18-01-2009, 20:44
ребята а если словосочетания к примеру нужно будет выделить, например "Раковая опухоль"?

Sham
18-01-2009, 21:22
версия PHP и PCRE? »
это не важно, мб с кодировкой не то (с setlocale дб нормально)...если словосочетания к примеру нужно будет выделить »
хоть предложение, только пробелы тоже в счет (либо пробелы нужно заменять на модификатор \s+ чтобы учитывал пробельные символы, включая табуляцию, перенос строки и тд)...




© OSzone.net 2001-2012