Проблема:
Регулярное выражение:
$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 словники) в тайтл, мета-теги, заголовки, ссылки, текст)
Анализ точного, прямого, разбавленного, морфологического, разбавленного морфологического, обратного входжения ключей (1-2-3 словники) в тайтл, мета-теги, заголовки, ссылки, текст)
Спустя 2 минуты, 51 секунда (4.05.2012 - 14:43) kotoFF написал(а):
Получается, что в регулярках при работе в utf-8 еще и границы слов не корректно определяются/вообще не определяются?
Или я не корректно регулярку составил.
Предложенная Вами (вместо \b - .*) сработала
Или я не корректно регулярку составил.
Предложенная Вами (вместо \b - .*) сработала
Спустя 5 минут, 44 секунды (4.05.2012 - 14:49) kotoFF написал(а):
Цитата (Игорь_Vasinsky @ 4.05.2012 - 12:33) |
$text = 'Проектирование и монтаж систем отопления коттеджа, Array всё пучком... перелинковку чтоли делаешь... |
А если так:
$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.
Это должно быть отдельностоящее слово, а не часть какого-то другого.
Это должно быть отдельностоящее слово, а не часть какого-то другого.