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


Автор: bars80080 19.2.2010, 01:24
вот, простенькая регулярка, а почему-то режет первую букву при utf8. причём не важно, кириллица, латиница ли

Код

$x = preg_replace('/^[a-zA-ZА-Яа-яЁё0-9 _\.\-,\/]/u', '', $x);

Автор: NLspieler 19.2.2010, 02:11
А какая была цель? Для чего предназначена регулярка?

Автор: skyboy 19.2.2010, 08:59
под "режет букву" имеется в виду замена символа в соответствие с приведенным кодом, или тот факт, что в двухбайтном коде кирилического символа заменяется только первый байт?

Автор: Nicklasos 19.2.2010, 15:34
Может глупо, но может дело в том как сохранен файл? 
Есть uft8 with BOM, попробуй сохранить файл как utf8 без bom.
Как-то давно у меня была похожая проблема с этим.

Автор: bars80080 19.2.2010, 16:01
не, тут нет никакого файла, есть строка из текстового поля формы. любая вообще, латинская, кириллическая - не важно.
делаю 
Код

$x = 'weg sdf gsger';
var_dump($x);
$x = preg_replace('/^[a-zA-ZА-Яа-яЁё0-9 _\.\-,\/]/u', '', $x);
var_dump($x);

получаю
Код

string(13) "weg sdf gsger" string(12) "eg sdf gsger"

куда он девает букву - не разумею

Автор: NLspieler 19.2.2010, 16:22
bars80080,
Так у тебя же в регулярке так и написано, что бы регулярка заменила первый символ строки на пустую строку и записала результат в туже переменную.

preg_replace - это аналог str_replace, только с регулярками. 

^ - означает начало строки,
в квадратных скобках идет список символов, которые нужно заменить на ''
/^[a-zA-ZА-Яа-яЁё0-9 _\.\-,\/]/u    
Вот и получается, что он удалет в строке первый символ, который входит в список добою перечисленных. 

В чем же проблема, я не могу понять? Или это прикол такой?  smile 


Автор: Nicklasos 19.2.2010, 16:33
Блин, точно ведь.
Может автор хотел написать preg_match()? Тогда будет находить первую букву, если не указать
'/^[a-zA-ZА-Яа-яЁё0-9 _\.\-,\/]*/u'

Автор: bars80080 19.2.2010, 17:17
вот блин, я тормоз. не могу ещё их писать проклятые.
я хотел вырезать всё не указанное. подстава оказалась в том, что в функции (с другими манипуляциями) оно работало с почти нужным результатом

вот так хотел
Код

$x = preg_replace('/[^a-zA-ZА-Яа-яЁё0-9 _\.\-,\/]/u', '', $x);


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