За последние 24 часа нас посетили 18748 программистов и 1611 роботов. Сейчас ищут 920 программистов ...

Помогите выделить целое слово на русском!

Тема в разделе "Регулярные выражения", создана пользователем timdenice, 9 фев 2010.

  1. timdenice

    timdenice Активный пользователь

    С нами с:
    8 фев 2010
    Сообщения:
    1
    Симпатии:
    0
    Добрый день всем!
    Полдня ломаю голову над проблемой - не могу написать правильно регулярку с выделением слова на русском или еще каком языке, кроме английского. например во фразе "Mister Mi drink a milk" выделяем только слово milk таким выражением /\b(milk)\b/ все работает на ура! Но если во фразе "Маленький Мук мал да удал" попробовать выделить слово мал таким способом /\b(мал)\b/ вхождений не находит. Проблема еще в том, что я не могу использовать setlocale чтобы исправить положение, так как слово поиска генерируется из PHP но сравнение происходит на JS и сравнивает скрипт с контентом из сайта. Пробовал сделать с помощью перекодировки строки в ASCII но не нашел функции которая делает это с кириллицей, нашел с французским, но толку от нее тоже мало , потому что приходится отрывать по букве и перекодировать в php-скрипте, а так как строка возвращается в utf8 substr работает некорректно, принимая специальные символы (типа наших ю,б и т.д.) за два бита, а вот напрямую если поставить только букву перекодирует нормально, но только не русский ( привожу код функции переводировки в ascii
    <?php
    function uniord($ch) {

    $n = ord($ch{0});

    if ($n < 128) {
    return $n; // no conversion required
    }

    if ($n < 192 || $n > 253) {
    return false; // bad first byte || out of range
    }

    $arr = array(1 => 192, // byte position => range from
    2 => 224,
    3 => 240,
    4 => 248,
    5 => 252,
    );

    foreach ($arr as $key => $val) {
    if ($n >= $val) { // add byte to the 'char' array
    $char[] = ord($ch{$key}) - 128;
    $range = $val;
    } else {
    break; // save some e-trees
    }
    }

    $retval = ($n - $range) * pow(64, sizeof($char));

    foreach ($char as $key => $val) {
    $pow = sizeof($char) - ($key + 1); // invert key
    $retval += $val * pow(64, $pow); // dark magic
    }

    return $retval;
    }

    $str='привет';

    $s='';
    echo "alert('".$str."');";



    echo "alert('".hexdec(uniord(substr($str,6,1)))."');";
    ?>
    выдаю в JS потому что обработка в регулярном выражении идет в JS код ascii возращаемый функцией не соответствует букве т