|
|
|
| Здраствуйте.
preg_match не реагирует на слова, окончивающиеся на некоторые буквы, такие как
и т.д. Флаг u не помогает. Скрипт в utf-8.
Если сталкивались, помогите, пожалуйста.
Спасибо.
P.S. Форум, наверное, не в utf. Для краткости, отмечу, что имеются в виду буквы с закорючками. | |
|
|
|
|
|
|
|
для: sp10
(20.09.2008 в 21:39)
| | а само выражение ?
для чего нужен поиск совпадения ?
пробовали-ли менять локаль ?
например так
setlocale(LC_ALL, array('ru_RU.utf8', 'ru_RU.UTF-8'));
// на виндовз не работает | |
|
|
|
|
|
|
|
для: xx77
(20.09.2008 в 22:09)
| | $word1 – слово, которое ищем
$word2 – слова, в которых ищем $word1 (в данном случае это элементы массива, которое получилось при расщеплении $text)
$text – текст
<?php
идет цикл для $word2
if(preg_match("#$word1#uis", $word2)):
$patterns["#$word2\b#uis"] = '<strong>\0</strong>';
конец цикла
$txt = preg_replace(array_keys($patterns),
array_values($patterns), $text);
?>
|
$txt – это получается $text с выделенными искомыми словами. Но слова, оканчивающиеся на указанные буквы, не выделяются. Отмечу, что скрипт на utf-8. Юникс, виндовс – не имеет значения. Локаль не действует.
Наверное, баг. | |
|
|
|
|
|
|
|
для: sp10
(21.09.2008 в 22:03)
| | написано как-будто не на php, хотя preg_match() но preg_match видел только в php
>>if(preg_match("#$word1#uis", $word2)):
>> $patterns["#$word2\b#uis"] = '<strong>\0</strong>';
по моему никогда в php не интерпретировалось \0 как совпавший текст за пределами самого выражения или строки замены для preg_replace
за пределы preg_match() можно вынести только массив preg_match("#$word1#uis", $word2, $matches)
где $matches[0] наверно и будет то что нужно
на счёт букв не досконально проверял , но похожие буквы находятся preg-функциями, если кодировка строк одинаковая, они только байты | |
|
|
|
|
|
|
|
для: xx77
(22.09.2008 в 00:57)
| | хотя кажется понял о чём Вы
для того чтобы работало с модификатором "i",
нужно выставить локаль,
в том предложенном способе массив значений возможно не содержал того значения которое могло быть нужно системе на которой запускаете, если это не windows
попробуйте добавить такое-же с rus_RUS ... и все возможные варианты , и посмотрите как получается
, при помощи echo setlocale(LS_ALL, 0);
или придётся word писать как [Ww][Oo][Rr][Dd]
некогда проверить как насчёт этого int mb_eregi( string pattern, string string [, array regs] ) | |
|
|
|
|
|
|
|
для: xx77
(22.09.2008 в 01:18)
| | Во-первых, спасибо за уделенное внимание.
А оказывается виноват флаг \b. Если его убрать, находятся все слова, на какую-бы букву не заканчивались. Но проблема в том, что тогда слова захватываются не целиком, а только та их часть, которая соответствует шаблону.
Словом, дилемма. Надо из двух зол выбрать лучшее. | |
|
|
|
|
|
|
|
для: sp10
(22.09.2008 в 19:14)
| | насчёт \b
оно наверное должно быть со всех сторон в обоих выражениях , если точное слово искать
<?
if(preg_match('#\b' . $word1 . '\b#ui', $word2)):
$patterns["#\\b$word2\\b#ui"] = '<strong>\0</strong>';
|
и "s" ненужен
или даже в если в $word2 только слово , то
<?
if (preg_match('#^' . $word1 . '$#ui', $word2)):
|
| |
|
|
|