Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Компьютеры + Интернет » Вебмастеру » Обработка строки preg_replace

Ответить
Настройки темы
Обработка строки preg_replace

Ветеран


Сообщения: 573
Благодарности: 8


Конфигурация

Профиль | Отправить PM | Цитировать


Изменения
Автор: venuko
Дата: 28-01-2009
PHP код: Выделить весь код

$words=array('World','пять и два','государств','Семь');

$open_tags=array('<a href="ssilka1">','<a href="ssilka2">','<a href="ssilka3">','<a href="ssilka4">');
$close_tags=array('</a>','</a>','</a>','</a>');

function 
highlight_first($text$words$open_tags$close_tags) {
    
$arReplace = array();
    for(
$i=0$i<count($words); $i++) {
        
//$words[$i] = '/('.preg_quote($words[$i]).')/iu';
        
$words[$i] = "/\b(".preg_quote($words[$i]).")\b/";
        
//$words[$i] = "/(?<![a-z0-9а-я])(".preg_quote($words[$i]).")(?![a-z0-9а-я])/iu";
        
$arReplace[]=  $open_tags[$i]. '\1'$close_tags[$i];
    }
    
$text =    preg_replace($words$arReplace$text1);
    return 
$text;
}

$text "Семь и ещё world World семь Буквы world разные и т.д. пять и два потом World Пять и два государственный. Семь государств и Шесть паШесть";
$text=highlight_first($text,$words,$open_tags,$close_tags);

echo 
$text

Результат работы скрипты такой: <a href="ssilka4">Семь</a> и ещё world <a href="ssilka1">World</a> семь Буквы world разные и т.д. <a href="ssilka2">пять и два</a> потом World Пять и два государственный. Семь <a href="ssilka3">государств</a> и Шесть паШесть

А должен быть: Результат работы скрипты такой: <a href="ssilka4">Семь</a> и ещё <a href="ssilka1">world</a> World семь Буквы world разные и т.д. <a href="ssilka2">пять и два</a> потом World Пять и два государственный. Семь <a href="ssilka3">государств</a> и Шесть паШесть


Т.е. скрипт в тексте оборчивает нужными тегами самые первые вхождения слов (повторения не оборачивает), слова для оборачивания в массиве, также теги. Проблема в том что что-то с регистром, т.е. слово World обернулось, а должно было world с маленькой буквы, так как оно первое вхождение. Подскажите в чем проблема, плиз?

Отправлено: 19:18, 28-01-2009

 

Ветеран


Сообщения: 1862
Благодарности: 132

Профиль | Сайт | Отправить PM | Цитировать


Цитата venuko:
т.е. слово World обернулось, а должно было world с маленькой буквы »
Так ты сам его убрал из массива
//$words[$i] = "/(?<![a-z0-9а-я])(".preg_quote($words[$i]).")(?![a-z0-9а-я])/iu"; буковку i надо разместить до слэша. Именно i отвечает за регистронезависимость.
Ну, а вообще регулярки мне всё время даются трудно.

-------
ДИЛЕТАНТ - это курьезный человек, который испытывает удовольствие делать то, чего не умеет.
AMD 4200+, MSI Neo2Platinum, 2Gb, ATI 9600, D-Link DWL-G510, FreeBSD 8.0, KDE 4.3.4


Отправлено: 21:05, 28-01-2009 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 1862
Благодарности: 132

Профиль | Сайт | Отправить PM | Цитировать


Нет я не прав.
$words[$i] = '/(?<=\s|^)(' . preg_quote($words[$i]) . ')(?=\s|$)/i';
Смотри здесь - http://forum.oszone.net/post-1011765-10.html

-------
ДИЛЕТАНТ - это курьезный человек, который испытывает удовольствие делать то, чего не умеет.
AMD 4200+, MSI Neo2Platinum, 2Gb, ATI 9600, D-Link DWL-G510, FreeBSD 8.0, KDE 4.3.4


Отправлено: 21:30, 28-01-2009 | #3


Ветеран


Сообщения: 573
Благодарности: 8

Профиль | Отправить PM | Цитировать


заменил на это вроде пашет:

$words[$i] = "/\b(".preg_quote($words[$i]).")\b/i";

это:
Цитата Igor_I:
$words[$i] = '/(?<=\s|^)(' . preg_quote($words[$i]) . ')(?=\s|$)/i'; »
в случае такого текста и массива замены, не будет как нужно работать:

$words=array('World','пять и два','государств','СеМь','Два и Восемь','два и восемь');
$open_tags=array('<a href="ssilka1">','<a href="ssilka2">','<a href="ssilka3">','<a href="ssilka4">','<a href="ssilka5">','<a href="ssilka6">');
$close_tags=array('</a>','</a>','</a>','</a>','</a>','</a>');

$text = "Семь и ещё world World семь Буквы world разные и т.д. пять и два потом World Пять и два государственный. Семь государств и Шесть паШесть. Два и Восемь и ещё потом буквы два и восемь";

Отправлено: 21:39, 28-01-2009 | #4


Deadooshka


Сообщения: 2482
Благодарности: 671

Профиль | Отправить PM | Цитировать


Цитата venuko:
не будет как нужно работать »
все будет работать - везде используется подмаска (и везде одна)...
если кодировка системы не соответствует, то флаг i не будет работать, поскольку не найдется другой регистр буквы (у нелатиницы)... т.е. нужно юзать setlocale с нужной кодировкой...

Отправлено: 03:10, 29-01-2009 | #5


Ветеран


Сообщения: 573
Благодарности: 8

Профиль | Отправить PM | Цитировать


Цитата Sham:
все будет работать - везде используется подмаска (и везде одна)...
если кодировка системы не соответствует, то флаг i не будет работать, поскольку не найдется другой регистр буквы (у нелатиницы)... т.е. нужно юзать setlocale с нужной кодировкой... »

а вотс setlocale не пойму как её применить, на сайте кодировка wuindows-1251

не пинайте я только учусь, подскажите

Отправлено: 09:29, 29-01-2009 | #6


Deadooshka


Сообщения: 2482
Благодарности: 671

Профиль | Отправить PM | Цитировать


PHP код: Выделить весь код

// для всех типов функций, для кириллицы


@setlocale(LC_ALL'ru_RU.CP1251'); 

Это сообщение посчитали полезным следующие участники:

Отправлено: 10:39, 29-01-2009 | #7


Ветеран


Сообщения: 573
Благодарности: 8

Профиль | Отправить PM | Цитировать


Цитата Sham:
// для всех типов функций, для кириллицы
@setlocale(LC_ALL, 'ru_RU.CP1251'); »
в CMS это возможно уже есть, так как тот код выводится в модуле, то думаю в самом модуле в начале это кода высталвять это @setlocale(LC_ALL, 'ru_RU.CP1251'); не нужно, так ли это?

Отправлено: 10:49, 29-01-2009 | #8


Deadooshka


Сообщения: 2482
Благодарности: 671

Профиль | Отправить PM | Цитировать


текущую локаль можно проверить
PHP код: Выделить весь код

// выведет текущую


echo @setlocale(LC_ALLNULL); 

и если стоит 1251, то не нужно... локаль должна соответствовать кодировке текста.

Отправлено: 11:04, 29-01-2009 | #9


Ветеран


Сообщения: 573
Благодарности: 8

Профиль | Отправить PM | Цитировать


локаль проверил она такая KOI8-R/ru_RU

Отправлено: 11:19, 29-01-2009 | #10



Компьютерный форум OSzone.net » Компьютеры + Интернет » Вебмастеру » Обработка строки preg_replace

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
MySQL - Автозамена строки из другой строки - trigger? procedure ? BugZZ Программирование и базы данных 0 18-09-2009 09:51
Обработка формы ][alter Вебмастеру 10 18-12-2007 00:18
Обработка видео Antonij Видео и аудио: обработка и кодирование 14 29-03-2007 21:44
Обработка лог-файла на C++ Guest Программирование и базы данных 17 23-03-2004 01:11
обработка и отправка форм MXM Вебмастеру 3 29-01-2004 19:18




 
Переход