регулярные выражения

ypeskov

Новичок
регулярные выражения и кириллица

люди такой вопрос.

есть база в 1251.
в одном из полей есть строка типа "*777х777*", где
777 - это 2 или 3 цифры
х - буква "х" в кдировке 1251.

задача - раскидать два числа (до "х" и после) в два новых поля.

пробую вычленить так:
PHP:
preg_match('/[0-9]{2,3}\w[0-9]{2,3}/', $sql_row['products_name'],  $result_array);
большую, часть подстрок во всех записях находит, но далеко не все.

Подозреваю, что дело в кодировках... ПОдскажието куда копать?
 

ypeskov

Новичок
а чем он мне поможет.

строка может быть "01. хкорова 56 190х80 метры сферические х56"

мне надо 190х80 выловить

-~{}~ 03.03.09 23:15:

не знаю, почему не работало, поборол следующим "нехорошим" способом:

сначала конвертирую из 1251 в юникод
$str = mb_convert_encoding($sql_row['products_name'], "UTF-8", "cp1251");

а потом таким регулярным:
preg_match('/([0-9]{2,3})(х|x|X|Х)([0-9]{2,3})/', $str, $result_array);
 

ypeskov

Новичок
разобрался до конца.
проблемы таки с кириллицей. с локале все в порядке.

финальная версия такая:
PHP:
preg_match('/([0-9]{2,3})(\p{L})([0-9]{2,3})/u', $str, $result_array);
а проблема описана очень хорошо и внятно
http://www.cataev.ru/blog/php/php-regexp-utf8/

ключевой момент:
Сразу запомним - метасимволы типа \w \s - с кирилицей по-человечески не работают. Вместо этого используем \p{xx}
 

LONGMAN

Dark Side of the Moon..
Имеется строка типа 'Re[0]:' как с помошью регулярки выделить и инкрементить цифра между скобок? Чтобы стало 'Re[1]:' 'Re[2]:' и т.д.
 

LONGMAN

Dark Side of the Moon..
Heresy, спасибо большое. Сделал так:
PHP:
$text = preg_replace_callback('/([0-9]+)/', create_function('$matches', 'return ++$matches[0];'),$text);
Сейчась интересно как можно заменить эту регулярку
PHP:
$msg = eregi_replace("((http://))((([a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z;]{2,3}))|(([0-9]{1,3}\.){3}([0-9]{1,3})))((/|\?)[a-z0-9~#%&'_\+=:;\?\.-]*)*)", "<a href=\"\\0\"> \\0 </a>", $msg);
на preg_replace
 

Heresy

Новичок
\\0 поменяй на ${0}, а по регуляркам RTFM.

P.S. Кстати, create_function будет создавать функцию каждый раз...
Надеюсь ты этот код не будешь помещать в цикл :)
 

LONGMAN

Dark Side of the Moon..
Нет конечно :)

-~{}~ 06.03.09 23:15:

Сделал так
PHP:
$msg = preg_replace("((http://))((([a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z;]{2,3}))|(([0-9]{1,3}\.){3}([0-9]{1,3}))) ((/|\?)[a-z0-9~#%&'_\+=:;\?\.-]*)*)", "<a href=\"${0}\"> ${0} </a>", $msg);
Но ошибку выдаёт, unknown modifier '('
 

x-yuri

Новичок
LONGMAN, а что у тебя ограничитель регулярки? Он есть в твоем варианте (хоть ты так и не думаешь)
 

dimagolov

Новичок
x-yuri, тема в том, что у него / тоже в регулярке есть и он ее не слешил

LONGMAN, "не сработал" ведь с другой ошибкой? почему не читал и головой не думал?
 

LONGMAN

Dark Side of the Moon..
Автор оригинала: x-yuri
LONGMAN, а что у тебя ограничитель регулярки? Он есть в твоем варианте (хоть ты так и не думаешь)
Не знаю, эта регулярка не моя, в инете нашёл.. Насколько я знаю ограничителом является '/' в начале и в конце, но здесь их нет

-~{}~ 07.03.09 01:05:

Автор оригинала: dimagolov

LONGMAN, "не сработал" ведь с другой ошибкой? почему не читал и головой не думал?
Та же ошибка, только место '(' был '/'
 

x-yuri

Новичок
Не знаю, эта регулярка не моя, в инете нашёл.. Насколько я знаю ограничителом является '/' в начале и в конце, но здесь их нет
не думаю, что есть какие-то ограничения на него: могут использоваться как не парные - #, так и парные - (, )
но присутствовать должен всегда

/ в PCRE спецсимвол, его надо эскэйпить
если / используется в качестве ограничителя
 

LONGMAN

Dark Side of the Moon..
Сделал так:
PHP:
$text = preg_replace("#(^|[\n])([\w]+?://[\w\#$%&~/.\-;:=,?@\[\]+]*)#is", "<a href=\"\\2\"> \\2 </a>", $text);
Что здесь в конце значит s?
 

LONGMAN

Dark Side of the Moon..
Значит здесь он лишний да?

-~{}~ 09.03.09 23:47:

Вот эта регулярка
PHP:
$queryes = preg_split("#(SELECT|CREATE|DROP|UPDATE|INSERT|SHOW|REVOKE|MATCH|LIKE|GRANT|DESCRIBE|OPTIMIZE|COUNT|ALTER|AGAINST|)[-a-z0-9_.:@&?=+,!/~*'%$\"\s\n]*;#i", $data);
Разделяет все запросы которые начинаются с SQL командой (на пример INSERT) и закончивается на ; да? Вот я хочу что он разделил не на ; а на );
Переписал регулярку так

PHP:
$queryes = preg_split("#(SELECT|CREATE|DROP|UPDATE|INSERT|SHOW|REVOKE|MATCH|LIKE|GRANT|DESCRIBE|OPTIMIZE|COUNT|ALTER|AGAINST|)[-a-z0-9_.:@&?=+,!/~*'%$\"\s\n]*\);#i", $data);
Но он некорректно работает, в чём причина?
 
Сверху