Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Регулярка для русскоязычных символов.
- это значит: сначала идет что угодно, в том числе и ничего, а за ним что-то что угодно обязательно хоть раз
я вообще удивляюсь как у тебя пых не сломался)
- это значит: сначала идет что угодно, в том числе и ничего, а за ним что-то что угодно обязательно хоть раз
я вообще удивляюсь как у тебя пых не сломался)
Берем в:
1. первый захват - один и больше любых одиночных символов - фамилия. Тут не важно пока для простоты - какой регистр и есть ли не буквенные символы.
ОДИН пробел
2. второй захват - любой одиночный символ - первая буква имени и дальше, вне захвата один и больше любых одиночных символов.
ОДИН пробел
3. третий захват - любой одиночный символ - первая буква отчества и дальше, вне захвата - один и больше любых одиночных символов.
Что тут должно было ломаться? Из за того, что вместо \s явные пробелы?
Мне нужно : Вся фамилия, первая буква имени и первая буква отчества. Между фамилией, именем и отчеством на входе - по одному пробелу.
Покинул форум
Сообщений всего: 116
Дата рег-ции: Дек. 2016
Помог: 0 раз(а)
LIME пишет:
'~^(.+) (.).+ (.).+$~uU'
За флаги совсем забыл. Спасибо!
Но у меня и по ним есть вопросы:
Зачем тут флаг нежадности, если в самом выражении уже все нужное указано?
И с флагом юникода - да, заработало. Но как фамилию то воспринимало правильно, а не спецсимволами? Почему проблема именно в восприятии одиночных букв.
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
Perun пишет:
Зачем тут флаг нежадности
я просто не помню что из них uU жадность, а что utf
Perun пишет:
Почему проблема именно в восприятии одиночных букв.
utf для кириллических симфолов - 2 байта
без указания модификатора первые байты до пробела были взяты в захват все, что составило правильное слово
после пробела был взят один байт, что не является одной буквой, и криво отображается в utf
Строитель
Отправлено: 17 Апреля, 2020 - 20:29:10
Участник
Покинул форум
Сообщений всего: 1581
Дата рег-ции: Февр. 2014 Откуда: Украина
php -r 'var_dump(preg_replace("~(\p{Lu})\S+~u", "$1.", "Иванов Иван Семенович"));'
string(11) "И. И. С."
Строитель
Отправлено: 17 Апреля, 2020 - 22:24:23
Участник
Покинул форум
Сообщений всего: 1581
Дата рег-ции: Февр. 2014 Откуда: Украина
Помог: 74 раз(а)
LIME пишет:
preg_match_all
Строитель пишет:
preg_replace
LIME
Отправлено: 17 Апреля, 2020 - 22:27:11
Активный участник
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
Строитель во первых и preg_replace выше есть покороче
зачем брать в захват весь паттерн?))
а во вторых... что тебе плохого сделал preg_match_all? ))
Строитель
Отправлено: 18 Апреля, 2020 - 10:43:22
Участник
Покинул форум
Сообщений всего: 1581
Дата рег-ции: Февр. 2014 Откуда: Украина
Помог: 74 раз(а)
LIME пишет:
во первых и preg_replace выше есть покороче
Теперь есть, но его не было, и в контексте preg_replace() шаблона \p{Lu} было недостаточно.
LIME пишет:
зачем брать в захват весь паттерн?))
Незачем, тут группировка не нужна, я поспешил.
LIME пишет:
что тебе плохого сделал preg_match_all?
А какой смысл в получении отдельных символов в массив, который снова надо преобразовывать в строку? preg_replace() тут идеальный вариант. Идеальнее неё, разве что твоё решение без регулярок. Хотя не факт, что будет оптимальнее по скорости, не замерял.
LIME
Отправлено: 18 Апреля, 2020 - 18:03:48
Активный участник
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
Строитель пишет:
А какой смысл в получении отдельных символов в массив, который снова надо преобразовывать в строку? preg_replace() тут идеальный вариант.
я не знаю какой смысл)
не знаю зачем эти букавы понадобились)
наверное ты что-то знаешь
пусть будет так)))
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.