Jump to content
  • 0

Регистронезависимый поиск


Антонов
 Share

Question

Задача найти все однокоренные слова в тексте. Составил рег. выражение:

preg_match_all('/\s([^\s]*'.$sub.'[^\s]*)/is', $text ,$q);

где

$sub-корень слова,

$text-текст,

$q-массив с результатом.

Данное выражение прекрасно работало на локальной машине под Windows, находились все слова независимо от регистра символов. Однако, когда я загрузил скрипт на сервер, работающий под FreeBSD, поиск в тексте стал регистрозависимым. Хотя модификатор i в рег. выражении стоит. Подскажите, в чём может быть проблема?

Link to comment
Share on other sites

15 answers to this question

Recommended Posts

  • 0

У меня в линуксе вполне правильно сработало рег. выражение

$str_message = "File text File <br/> text

<a href=\"#\"> download here</a> text";

preg_match_all('/[\s]([^\s]*fil[^\s]*)/is',$str_message,$matches);
var_dump($matches);

вывел

array(2) {

[0]=>

array(1) {

[0]=>

string(5) " File"

}

[1]=>

array(1) {

[0]=>

string(4) "File"

}

}

Link to comment
Share on other sites

  • 0

Странно. А настройка локали может влиять на результаты поиска? Я пробовал запустить вначале скрипта ф-ию setlocale(LC_ALL, "ru_RU"), но бесполезно.

2xPoint регистрозависимость только в кириллице, в латинице поиск осуществляется без учета регистра символов.

Edited by Антонов
Link to comment
Share on other sites

  • 0
2xPoint регистрозависимость только в кириллице, в латинице поиск осуществляется без учета регистра символов.

да, я сейчас попробовал на кириллице и поиск не сработал. Вся проблема в кодировке. Для решения проблемы нужно добавить модификатор u к рег. выражению.

Link to comment
Share on other sites

  • 0

Проблема в локали, практически точно. Нужно узнать у хостера, как называется правильная локаль для русского языка. В крайнем случае, попробовать перебрать другие вероятные названия локалей кроме "ru_RU" (например, "ru_RU.CP1251" и т.п.).

Link to comment
Share on other sites

  • 0

2SelenIT хостеру я написал ещё вчера. Пока тишина. ru_RU.CP1251 тоже пробовал.

2xPoint с u номер не прошёл. Выдаёт ошибку и на localhost и на сервере.

Warning: preg_match_all() [function.preg-match-all]: Compilation failed: invalid UTF-8 string at offset 21 in /hom

Пока решил проблему ф-ией strtolower, но всё-таки хочу разобраться с этим вопросом доконца.

Link to comment
Share on other sites

  • 0
Warning: preg_match_all() [function.preg-match-all]: Compilation failed: invalid UTF-8 string at offset 21 in /hom

по всей видимости проверяемые строки должны быть в утфной кодировке.

Как альтернативу можете попробовать функцию mb_eregi. По идее должна работать исправно. Только учтите, что рег.выражение нужно будет переписать под POSIX

Link to comment
Share on other sites

  • 0

А искать нужно просто слово?

Может попробовать mb_stristr?

У меня тоже была проблема с поиском по UTF-8. Английские ищет, а остальное просто игнорирует. :) Так и не нашел ничего хорошего по этому вопросу :)

И вот еще кое что в комментариях по данному вопросу: http://webew.ru/posts/1836.webew

Edited by Ялекс
Link to comment
Share on other sites

  • 0
Проблема в локали, практически точно. Нужно узнать у хостера, как называется правильная локаль для русского языка. В крайнем случае, попробовать перебрать другие вероятные названия локалей кроме "ru_RU" (например, "ru_RU.CP1251" и т.п.).

Это тоже может сработать. Сейчас немного потестил и оказалось, что при установке локали setlocale(LC_ALL,"ru_RU.CP1251"); текст написанный в кирилеце в кодировке cp1251 находит нормально. Хотя у меня линукс и будет ли это работать во фряхе я ручаться не могу.

Link to comment
Share on other sites

  • 0

Заменил strtolower на mb_strtolower, только тогда все символы преобразовались в нижний регистр. Буду теперь разбираться с рег. выражениями. А хостер запросил, цитирую:

Если Вы уверены что это происходит из-за настроек нашего сервера,

пришлите ссылку на скрипт, где реализован только неработающий фрагмент,

который приводит к ошибке на нашем сервере. Это поможет в кратчайшие

сроки разобраться с проблемами на сервере, или сказать по какой причине

это невозможно реализовать на нашем хостинге.

Ссылку то я дам, но он сможет только посмотреть результат работы скрипта, а не исходник.

Link to comment
Share on other sites

  • 0

Вобщем, мне кажется, что нужной локали на хостинге нет.

Вот результат проверки

Агава

print (setlocale(LC_ALL, 0)) возвращает С и больше ничего, причём независимо, что я пытаюсь установить.

localhost

print (setlocale(LC_ALL, 0)) возвращает LC_COLLATE=C;LC_CTYPE=Russian_Russia.1251;LC_MONETARY=C;LC_NUMERIC=C;LC_TIME=C

И повторный ответ хостера это подтверждает:

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

Использование Вами mb_strtolower более оправдано, чем изменение настроек

локали, что может отразится на работе с различными кодировками на других

машинах.

Мы будем заниматься этим вопросом и в скором времени найдем правильное

решение.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy