Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Проблема preg_match с некоторыми символами
 
 автор: sp10   (20.09.2008 в 21:39)   письмо автору
 
 

Здраствуйте.

preg_match не реагирует на слова, окончивающиеся на некоторые буквы, такие как


ü, ş, ı


и т.д. Флаг u не помогает. Скрипт в utf-8.

Если сталкивались, помогите, пожалуйста.

Спасибо.

P.S. Форум, наверное, не в utf. Для краткости, отмечу, что имеются в виду буквы с закорючками.

  Ответить  
 
 автор: xx77   (20.09.2008 в 22:09)   письмо автору
 
   для: sp10   (20.09.2008 в 21:39)
 

а само выражение ?
для чего нужен поиск совпадения ?

пробовали-ли менять локаль ?
например так
setlocale(LC_ALL, array('ru_RU.utf8', 'ru_RU.UTF-8'));
// на виндовз не работает

  Ответить  
 
 автор: sp10   (21.09.2008 в 22:03)   письмо автору
 
   для: 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. Юникс, виндовс – не имеет значения. Локаль не действует.

Наверное, баг.

  Ответить  
 
 автор: xx77   (22.09.2008 в 00:57)   письмо автору
 
   для: 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 в 01:18)   письмо автору
 
   для: 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] )

  Ответить  
 
 автор: sp10   (22.09.2008 в 19:14)   письмо автору
 
   для: xx77   (22.09.2008 в 01:18)
 

Во-первых, спасибо за уделенное внимание.

А оказывается виноват флаг \b. Если его убрать, находятся все слова, на какую-бы букву не заканчивались. Но проблема в том, что тогда слова захватываются не целиком, а только та их часть, которая соответствует шаблону.
Словом, дилемма. Надо из двух зол выбрать лучшее.

  Ответить  
 
 автор: xx77   (22.09.2008 в 23:40)   письмо автору
 
   для: 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)): 

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования