[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Не срабатывает регулярное выражение utf-8
kotoFF
Задача: проанализировать вхождение слова (одного) в строке
Проблема:
Регулярное выражение:
$cnt_exact = preg_match_all('#\b('.$key.')\b#usi', $string, $w1);

где $cnt_exact - количество вхождений, $key - слово, которое ищем, $string - строка, в которой ищем, $w1 - карман.

Файл со скриптом имеет кодировку utf-8 без bom, в meta теге указана кодировка utf-8, в скрипте устанавливается заголовок и локаль (в начале)
header ('Content-type: text/html; charset=utf-8');
setlocale(LC_ALL, "ru_RU.utf-8");


На локальном сервере (openserver) регулярное выражение срабатывает в таком виде, как есть.
При переносе на сервер столкнулся с тем, что регулярка в таком виде не работает. Передаваемые ей $key и $string обработаны функцией mb_strtolower()

$key = mb_strtolower($key, 'utf-8');
$string = mb_strtolower($string, 'utf-8');


Методом исключения переменных из параметров регулярки, выяснил, что виной всему переменная $key.
В таком виде:
$cnt_exact = preg_match_all('#\b(монтаж)\b#usi', $string, $w1);

оно срабатывает и находит все вхождения.

Что нужно сделать с переменной $key? В чем может быть причина, что на переменную не срабатывает?

На сервере сначала не было руских локалей. Попросил хостера, поставили ru_RU.cp1251,
ru_RU.utf8, но все равно не срабатывает.



Спустя 6 минут, 51 секунда (4.05.2012 - 14:21) Игорь_Vasinsky написал(а):
дай текст в котором ищешь и слова которые ищешь

Спустя 7 минут, 39 секунд (4.05.2012 - 14:28) kotoFF написал(а):
Цитата (Игорь_Vasinsky @ 4.05.2012 - 12:21)
дай текст в котором ищешь и слова которые ищешь

Текст, в котором искать: "Проектирование и монтаж систем отопления коттеджа, частного дома – Проектирование котельных для отопления загородного дома – Составление схем, подбор оборудования"
Текст, который ищем: "монтаж"

Спустя 4 минуты, 58 секунд (4.05.2012 - 14:33) Игорь_Vasinsky написал(а):
   $text = 'Проектирование и монтаж систем отопления коттеджа, 
частного дома – Проектирование котельных для отопления загородного дома – Составление схем, подбор оборудования'
;

$word = 'монтаж';

preg_match_all('#.*('.$word.').*#isu', $text, $links);

echo '<pre>' . print_r($links, 1) . '</pre>';


Array
(
[0] => Array
(
[0] => Проектирование и монтаж систем отопления коттеджа,
частного дома – Проектирование котельных для отопления загородного дома – Составление схем, подбор оборудования
)

[1] => Array
(
[0] => монтаж
)

)


всё пучком...

перелинковку чтоли делаешь...

Спустя 7 минут, 2 секунды (4.05.2012 - 14:40) kotoFF написал(а):
Нет.
Анализ точного, прямого, разбавленного, морфологического, разбавленного морфологического, обратного входжения ключей (1-2-3 словники) в тайтл, мета-теги, заголовки, ссылки, текст)

Спустя 2 минуты, 51 секунда (4.05.2012 - 14:43) kotoFF написал(а):
Получается, что в регулярках при работе в utf-8 еще и границы слов не корректно определяются/вообще не определяются?
Или я не корректно регулярку составил.
Предложенная Вами (вместо \b - .*) сработала

Спустя 5 минут, 44 секунды (4.05.2012 - 14:49) kotoFF написал(а):
Цитата (Игорь_Vasinsky @ 4.05.2012 - 12:33)
   $text = 'Проектирование и монтаж систем отопления коттеджа, 
частного дома – Проектирование котельных для отопления загородного дома – Составление схем, подбор оборудования'
;
 
  $word = 'монтаж';
 
  preg_match_all('#.*('.$word.').*#isu', $text, $links);
 
  echo '<pre>' . print_r($links, 1) . '</pre>';


Array
(
    [0] => Array
        (
            [0] => Проектирование и монтаж систем отопления коттеджа,
частного дома – Проектирование котельных для отопления загородного дома – Составление схем, подбор оборудования
        )

    [1] => Array
        (
            [0] => монтаж
        )

)


всё пучком...

перелинковку чтоли делаешь...

А если так:
$word = 'город';

то результат уже не верный будет
Array
(
[0] => Array
(
[0] => Проектирование и монтаж систем отопления коттеджа,
частного дома – Проектирование котельных для отопления загородного дома – Составление схем, подбор оборудования
)

[1] => Array
(
[0] => город
)

)

Спустя 3 часа, 43 минуты, 9 секунд (4.05.2012 - 18:32) Игорь_Vasinsky написал(а):
Цитата
А если так:


ну вот же:

Цитата
  [1] => Array
        (
            [0] => город
        )

Спустя 11 часов, 52 минуты, 15 секунд (5.05.2012 - 06:24) kotoFF написал(а):
часть "город" входит в "загородного", а нужно то именно слово "город", т.е. для данной строки и слова "город" результат preg_match_all должен быть 0.

Это должно быть отдельностоящее слово, а не часть какого-то другого.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.