Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Тексты > Регулярка учитывает регистр, а не должна


Автор: ashenemy 16.2.2009, 04:48
Есть такой текст
<a href="http://www.moiki.biz/"><b><span>ссыЛка 6 для теСТу</span></b></a>

регулярка - /<a(.*)?href=(\'|")?http:\/\/www.moiki.biz(\/)?(\'|")?(.*)?>(.*)ссылка 6 для тесту(.*)<\/a>/Uis - не пашет потому что не совпадают регистры, но должно же ведь. помогите плз

Автор: skyboy 16.2.2009, 11:59
данные не в UTF-8 случайно?

Автор: ashenemy 16.2.2009, 13:22
Нет данные в cp1251 в какой они должны быть то чтобы нормально все пахало? задолбался уже с этими кодировками

Автор: skyboy 16.2.2009, 15:13
покажи строку с вызовом РНР-функции полностью.

Автор: ashenemy 16.2.2009, 15:53
preg_match("/<a(.*)?href=(\'|")?http:\/\/www.moiki.biz(\/)?(\'|")?(.*)?>(.*)ссылка 6 для тесту(.*)<\/a>/Uis", $string, $return);

Автор: Валерия 16.2.2009, 19:17
у тебя шаблон
//Uis

модификаторы
U, i, s
Так вот, модификатор i это "учитывать регистр", убери его smile

Автор: skyboy 16.2.2009, 20:40
Цитата(Валерия @  16.2.2009,  18:17 Найти цитируемый пост)
модификатор i это

insensetive - не учитывать регистр.

Автор: unicross 16.2.2009, 22:50
Цитата(ashenemy @  16.2.2009,  15:53 Найти цитируемый пост)
preg_match("/<a(.*)?href=(\'|")?http:\/\/www.moiki.biz(\/)?(\'|")?(.*)?>(.*)ссылка 6 для тесту(.*)<\/a>/Uis", $string, $return);

Так будет ошибка. Попробуйте так. У меня работает.
Код

<?php
$str = '<a href="http://www.moiki.biz/"><b><span>ссыЛка 6 для теСТу</span></b></a>';
preg_match('/<a(.*)?href=(\'|")?http:\/\/www.moiki.biz(\/)?(\'|")?(.*)?>(.*)ссылка 6 для тесту(.*)<\/a>/Uis', $str, $return);
print_r($return);
?>

Если не поможет, то пробуем настроить локаль. Добавьте строку в начало скрипта:
Код

setlocale(LC_ALL, "ru_RU.CP1251");


Если не поможет, тогда пробуем вариант, который предположил skyboy и предполагаем, что строка в utf-8:
Код

<?php
$str = '<a href="http://www.moiki.biz/"><b><span>ссыЛка 6 для теСТу</span></b></a>';
preg_match('/<a(.*)?href=(\'|")?http:\/\/www.moiki.biz(\/)?(\'|")?(.*)?>(.*)ссылка 6 для тесту(.*)<\/a>/Uisu', $str, $return);
print_r($return);
?>



Автор: ashenemy 17.2.2009, 02:42
setlocale(LC_ALL, "ru_RU.CP1251");

спасибо помогло 

Автор: xoptov 21.1.2013, 21:17
Цитата(ashenemy @ 17.2.2009,  02:42)
setlocale(LC_ALL, "ru_RU.CP1251");

спасибо помогло

У меня та же проблема. К сожалению setlocale(LC_ALL, "ru_RU.CP1251"); не помогло!

Скрипт сохранен в кодировке cp1251.

следующий пример кода:
Код

setlocale(LC_ALL, "ru_RU.CP1251");
$name = "тестирование вырАжЕния";
preg_match('/в([а-я]+)я/i', $name, $match);
var_dump($match);

результат:
Код

array(0) { }


а следующий код:
Код

setlocale(LC_ALL, "ru_RU.CP1251");
$name = "тестирование выражения";
preg_match('/в([а-я]+)я/i', $name, $match);
var_dump($match);

результат:
Код

array(2) { [0]=> string(9) "выражения" [1]=> string(7) "ыражени" }


у кого есть мысли по этому поводу? Заранее благодарен за помощь!

Автор: Aliance 22.1.2013, 10:24
Наверное потому, что ([а-я]+) не включает в себя символы верхнего регистра. Нужно написать либо ([A-я]+), либо (\w+)

Автор: xoptov 22.1.2013, 13:04
Цитата(Aliance @ 22.1.2013,  10:24)
Наверное потому, что ([а-я]+) не включает в себя символы верхнего регистра. Нужно написать либо ([A-я]+), либо (\w+)

Не правильно, садись 2.

П.С. этот скрипт под Windows работает отлично, а под Linux вот так глючит...

Автор: Arantir 22.1.2013, 13:40
xoptov, не понимаю, зачем вам именно а-я с модификатором i? Вот А-я прекрасно работает в cp1251. Или, по-вашему, есть другие символы с разным регистром помимо всех в алфавите?

Автор: xoptov 22.1.2013, 19:19
Цитата(Arantir @ 22.1.2013,  13:40)
xoptov, не понимаю, зачем вам именно а-я с модификатором i? Вот А-я прекрасно работает в cp1251. Или, по-вашему, есть другие символы с разным регистром помимо всех в алфавите?

Вы правы, с диапазоном все можно решить проще. Но мне нужен именно рабочий модификатор i.
Следующий скрипт тоже выводит на экран нулевой результат в Linux:

Код

setlocale(LC_ALL, "ru_RU.CP1251");
$name = "тестирование вырАжЕНия";
preg_match('/жен/i', $name, $match);
var_dump($match);


Модификатор i мне нужен для того чтобы автоматически строить шаблоны из записей в БД. Схема следующая: в БД есть около 800 строк которые должны участвовать в сравнении и если текст совпадает с одной из этих строк то возвращается идентификатор совпавшей строки. Эти 800 строк я преобразую в регулярные выражения по которым и делаю сравнение и тут без модификатора i не обойтись. Как то проблемно преобразовать 800 строк вручную.

Автор: Fortop 22.1.2013, 20:15
Цитата(xoptov @  22.1.2013,  13:04 Найти цитируемый пост)
Не правильно, садись 2.

П.С. этот скрипт под Windows работает отлично, а под Linux вот так глючит... 

Вот чтобы выпендриваться так, нужно обладать знаниями и способностью решить проблему самостоятельно.

Проверь что у тебя установилась локаль корректно и что она вообще у тебя есть в системе - бездарь.

Автор: xoptov 25.1.2013, 09:27
Цитата(Fortop @ 22.1.2013,  20:15)
Вот чтобы выпендриваться так, нужно обладать знаниями и способностью решить проблему самостоятельно.

Проверь что у тебя установилась локаль корректно и что она вообще у тебя есть в системе - бездарь.


Да вы правы, бездарь я! Подскажите как проверить правильно ли установилась локаль?

Добавлено через 13 минут и 21 секунду
Старый анекдот про Кашперовского.
На сцене стоит Кашпировский с инвалидом в каталке и говорит:
- Встань и иди!
Из зала ему:
- Да ты шарлатан!
Кашпировский поворачиваться в зал и говорит:
- Сиди и не пиз....и!

Ну это так к слову...

Автор: Fortop 25.1.2013, 21:36
Цитата(xoptov @  22.1.2013,  19:19 Найти цитируемый пост)
setlocale(LC_ALL, "ru_RU.CP1251");

посмотреть на результат вызова этой функции

И вообще выполнить в консоли команду (под unix она есть)
Код

locale -a

она покажет список доступных локалей в системе.

Автор: xoptov 26.1.2013, 02:13
Цитата(Fortop @ 25.1.2013,  21:36)
Цитата(xoptov @  22.1.2013,  19:19 Найти цитируемый пост)
setlocale(LC_ALL, "ru_RU.CP1251");

посмотреть на результат вызова этой функции

И вообще выполнить в консоли команду (под unix она есть)
Код

locale -a

она покажет список доступных локалей в системе.

Да вы правы! Вызов setlocale(LC_ALL, "ru_RU.CP1251") вообще ничего не возвращает, а setlocale(LC_ALL, "ru_RU.KOI8-R") возвращает результат!

К сожалению к ssh доступа нет ;-(

В принципе проблема решена установкой локали в UTF-8 и работа с этой кодировкой. 

Спасибо Fortop за помощь в поиске окончательного решения smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)