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 :: Регулярка для русскоязычных символов.

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Perun
Отправлено: 13 Апреля, 2020 - 13:52:54
Post Id


Гость


Покинул форум
Сообщений всего: 116
Дата рег-ции: Дек. 2016  


Помог: 0 раз(а)




PHP:
скопировать код в буфер обмена
  1. $name = 'Иванов Иван Семенович';
  2. $result = preg_match('~^(.+) (.).+ (.).+$~', $name, $matches); // Первый захват делает правильно, а два последующих  ставит как заменяющий символ. Почему?
 
 Top
LIME
Отправлено: 13 Апреля, 2020 - 20:55:57
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




PHP:
скопировать код в буфер обмена
  1. preg_match('~^([а-яА-ЯёЁ]+)\s+([а-яА-ЯёЁ]+)\s+([а-яА-ЯёЁ]+)$~', $name, $matches);
  2.  
Цитата:
(.).+
- это значит: сначала идет что угодно, в том числе и ничего, а за ним что-то что угодно обязательно хоть раз
я вообще удивляюсь как у тебя пых не сломался)

(Отредактировано автором: 13 Апреля, 2020 - 20:57:36)

 
 Top
Perun
Отправлено: 13 Апреля, 2020 - 21:21:05
Post Id


Гость


Покинул форум
Сообщений всего: 116
Дата рег-ции: Дек. 2016  


Помог: 0 раз(а)




LIME пишет:
PHP:
скопировать код в буфер обмена
  1. preg_match('~^([а-яА-ЯёЁ]+)\s+([а-яА-ЯёЁ]+)\s+([а-яА-ЯёЁ]+)$~', $name, $matches);
  2.  
Цитата:
(.).+
- это значит: сначала идет что угодно, в том числе и ничего, а за ним что-то что угодно обязательно хоть раз
я вообще удивляюсь как у тебя пых не сломался)


Как минимум на RegEx101 все работает правильно.


Берем в:
1. первый захват - один и больше любых одиночных символов - фамилия. Тут не важно пока для простоты - какой регистр и есть ли не буквенные символы.
ОДИН пробел
2. второй захват - любой одиночный символ - первая буква имени и дальше, вне захвата один и больше любых одиночных символов.
ОДИН пробел
3. третий захват - любой одиночный символ - первая буква отчества и дальше, вне захвата - один и больше любых одиночных символов.

Что тут должно было ломаться? Из за того, что вместо \s явные пробелы?
Мне нужно : Вся фамилия, первая буква имени и первая буква отчества. Между фамилией, именем и отчеством на входе - по одному пробелу.

А вот эта строка :
PHP:
скопировать код в буфер обмена
  1. preg_match('~^([а-яА-ЯёЁ]+)\s+([а-яА-ЯёЁ]+)\s+([а-яА-ЯёЁ]+)$~', $name, $matches);
не работает. Не захватывает даже полностью имя и фамилию. Хотя в RegEx101 - тоже работает корректно, как и выражение из первого сообщения.

(Отредактировано автором: 13 Апреля, 2020 - 21:36:01)

 
 Top
LIME
Отправлено: 13 Апреля, 2020 - 22:39:36
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




так тебе инициалы надо
так бы и сказал
попробуй
PHP:
скопировать код в буфер обмена
  1. preg_match('~^(.+) (.).+ (.).+$~uU', $name, $matches);
  2.  

или
PHP:
скопировать код в буфер обмена
  1. [$secondName, $firstName, $lastName] = explode(' ', $name);
  2. $sN = mb_substr($secondName, 0, 1);
 
 Top
Perun
Отправлено: 13 Апреля, 2020 - 23:26:59
Post Id


Гость


Покинул форум
Сообщений всего: 116
Дата рег-ции: Дек. 2016  


Помог: 0 раз(а)




LIME пишет:
'~^(.+) (.).+ (.).+$~uU'

Здорово
За флаги совсем забыл. Спасибо!
Но у меня и по ним есть вопросы:
Зачем тут флаг нежадности, если в самом выражении уже все нужное указано?
И с флагом юникода - да, заработало. Но как фамилию то воспринимало правильно, а не спецсимволами? Почему проблема именно в восприятии одиночных букв.

(Отредактировано автором: 13 Апреля, 2020 - 23:27:27)

 
 Top
LIME
Отправлено: 13 Апреля, 2020 - 23:37:21
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




Perun пишет:
Зачем тут флаг нежадности
я просто не помню что из них uU жадность, а что utf

Perun пишет:
Почему проблема именно в восприятии одиночных букв.

utf для кириллических симфолов - 2 байта
без указания модификатора первые байты до пробела были взяты в захват все, что составило правильное слово
после пробела был взят один байт, что не является одной буквой, и криво отображается в utf
 
 Top
Строитель Модератор
Отправлено: 17 Апреля, 2020 - 20:29:10
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 73 раз(а)




Perun,
PHP:
скопировать код в буфер обмена
  1. $name = 'Иванов Иван Семенович';
  2. $name = preg_replace('~(?:(\p{Lu})\S+)+~u', '$1.', $name);
  3.  
  4. var_dump($name); // 'И. И. С.'
 
 Top
LIME
Отправлено: 17 Апреля, 2020 - 20:34:04
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




Строитель тогда уж \p{Lu} достаточно
 
 Top
Строитель Модератор
Отправлено: 17 Апреля, 2020 - 20:35:28
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 73 раз(а)




LIME, не достаточно.
 
 Top
LIME
Отправлено: 17 Апреля, 2020 - 20:41:11
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




Цитата:
php -r 'preg_match_all("~\p{Lu}~uU", "Иванов Иван Семенович", $m);var_dump($m);'
CODE (htmlphp):
скопировать код в буфер обмена
  1. array(1) {
  2.   [0]=>
  3.   array(3) {
  4.     [0]=>
  5.     string(2) "И"
  6.     [1]=>
  7.     string(2) "И"
  8.     [2]=>
  9.     string(2) "С"
  10.   }
  11. }

(Добавление)
Цитата:
php -r 'var_dump(preg_replace("~(\p{Lu})\S+~u", "$1.", "Иванов Иван Семенович"));'
string(11) "И. И. С."
 
 Top
Строитель Модератор
Отправлено: 17 Апреля, 2020 - 22:24:23
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 73 раз(а)




LIME пишет:
preg_match_all
Строитель пишет:
preg_replace
 
 Top
LIME
Отправлено: 17 Апреля, 2020 - 22:27:11
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




Строитель во первых и preg_replace выше есть покороче
зачем брать в захват весь паттерн?))
а во вторых... что тебе плохого сделал preg_match_all? ))
 
 Top
Строитель Модератор
Отправлено: 18 Апреля, 2020 - 10:43:22
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 73 раз(а)




LIME пишет:
во первых и preg_replace выше есть покороче
Теперь есть, но его не было, и в контексте preg_replace() шаблона \p{Lu} было недостаточно.
LIME пишет:
зачем брать в захват весь паттерн?))
Незачем, тут группировка не нужна, я поспешил.
LIME пишет:
что тебе плохого сделал preg_match_all?
А какой смысл в получении отдельных символов в массив, который снова надо преобразовывать в строку? preg_replace() тут идеальный вариант. Идеальнее неё, разве что твоё решение без регулярок. Хотя не факт, что будет оптимальнее по скорости, не замерял.
 
 Top
LIME
Отправлено: 18 Апреля, 2020 - 18:03:48
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




Строитель пишет:
А какой смысл в получении отдельных символов в массив, который снова надо преобразовывать в строку? preg_replace() тут идеальный вариант.
я не знаю какой смысл)
не знаю зачем эти букавы понадобились)
наверное ты что-то знаешь
пусть будет так)))
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB