мне нужно чтобы из строки удалились все символы кроме букв. В результате preg_replace() удаляет и часть букв. может рег выражение составлено криво? HTML: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Untitled Document</title> </head> <body> PHP: <? $z= "asd ^&* Иванов Иван Иванович%^&"; $z = preg_replace ("/[^a-zA-ZА-Яа-я\s]/","",$z); echo $z; ?> HTML: </body> </html>
В таком случае: Код (Text): <? $z= "asd ^&* Иванов Иван Иванович%^&"; $z = preg_replace ("/[^a-zа-я\s]/ui","",$z); echo $z; ?> где u- unicode, i - ignore casing
Лови ! локаль выставил. Также выставил возможность обратной связи по ошибкам. u --это модификатор жадности и к локали отношения не имеет. PHP: <? ini_set('display_errors',1); error_reporting(E_ALL); setlocale(LC_ALL, 'ru_RU.CP1251', 'rus_RUS.CP1251', 'Russian_Russia.1251'); $z= "asd ^&* Иванов Иван Иванович%^&"; $z = preg_replace ("/[^a-zа-я\s]/si","",$z); echo $z; ?>
Тема в ТОП5 гугля ее НАДО апать )) хотел применить для защиты от инъекций через ГЕТ с ЮТФ8 получилась естественно каща ненавижу эту кодировку. она в теории Г. повозился с локалями понял, что это на долго и забил. Надо подключать МБ пакет. (( некогда оставил вот так $_GET["tag"]=' Агат+union+select+null,nu"ll/*' ; $z = preg_replace ("/[ (,+\'\"]/si","",$_GET["tag"]); print $z; exit; теоретически - это превратит иньекцию в бред. Скуль отдаст 0 строк и двигло выкинет на 404
вы просто не понимаете назначения данной кодировки. есть ascii которая описывает 128 символов среди которых весь латинский алфавит, нумералы, знаки пунктуации и управляющие символы. остальные 128 символов дополняющие байт состоят из знаков, зависящих от кодовой таблицы. только для одной кириллицы их несколько штук среди которых самые популярные: cp1251 - виндовз вариант, cp866 - дос вариант, koi8r - русский вариат кода обмена информацией, koi8u - украинский вариант КОИ. гонять данные между этими кодировками - унылое Г. во времена модема может еще у кого-то жопа орехи и колола от одной мысли что символ придется кодировать более чем одним байтом. во времена повсеместного широковещательного доступа такой экономии просто не должно быть. везде надо использовать юникод или ютф8+. что дают эти кодировки? по факту это одна большая таблица символов которая описывает глифы всех существующих на Земле языков и даже различную графические символы вроде смайликов. то есть нет геморроя с десятком вариантом кириллицы, например. то что у вас получилась каша говорит только о том что у вас нет представления о том как кодируются те данные с которыми вы работаете. вот и всё. отличнейшая кодировка ю-ти-эф-восемь не виновата в том откуда у вас руки растут. допустим есть строка "бгд". я знаю что это строчные "б", "г" и "д". и юникод мне их правильно покажет. а если мы будем работать с однобайтной кодировкой? допустим исходных текст совпал в кодировке сипи1251 и кажет нам правильные "бгд" в дос (сипи866): "ЎЈ¤" - ну это надо перекодировать как-то. а в кои8р/кои8у - "ВЗД"! а это надо перекодировать? в исходном виде были бгд то есть произвольная последовательность строчных символов. ВЗД это такая же произвольная последовательность только прописных символов. вот ведь незадача. какая кодировка-то у нас если текст в кириллице но совершенно не имеет логического смысла и по словарю мы его хер найдем?.. используйте юникод. не будьте Г. хороших выходных.
Какой нахер жадность. u - это валидность UTF-8. U - инвертирует жадность квантификаторов, и то по умолчанию они не жадные. Но становятся жадными, если за ними следует символ " ? ". А у него какраз проблема с unicod'ом, ну и с руками тоже не в обиду.
по умолчанию они как раз жадные. и не потому что после них ? стоит. и соответственно жадность выключает. U = Ungreen, не жадный.