Как сделать регулярное выражение для аббревиатуры имени

У меня есть исходные данные, подобные этому

Исходные данные:

  • SRI ISTYANINGSIH
  • DIANA WREDHININGSIH
  • ENDANG WAHYU PURWANINGSIH
  • THERESIA PUDJI ASTUTIE SARI

И мне нужно показать это так:

Просмотр данных:

  • SRI I.
  • DIANA W.
  • ENDANG W. P.
  • THERESIA P. A. S.

Как я могу выполнить это с помощью PHP и регулярных выражений?

0
вы хотите сделать это только с регулярным выражением? Если вы хотите сделать с PHP, то проверьте мой ответ.
добавлено автор Bhavik Shah, источник
вы хотите сделать это только с регулярным выражением? Если вы хотите сделать с PHP, то проверьте мой ответ.
добавлено автор Bhavik Shah, источник

6 ответы

предположим, что $ var имеет строку, которую вы хотите преобразовать.

$var = "THERESIA PUDJI ASTUTIE SARI";

$parts = explode(" ", $var);
$str = $parts[0]." ";
for($i=1; $i
1
добавлено

предположим, что $ var имеет строку, которую вы хотите преобразовать.

$var = "THERESIA PUDJI ASTUTIE SARI";

$parts = explode(" ", $var);
$str = $parts[0]." ";
for($i=1; $i
1
добавлено

Я не знаю, что вы имеете в виду под «make delimiter», но вот решение на основе регулярных выражений:

function shorten_name($name) {
    return preg_replace('/ (\w)\w*/', ' $1.', $name);
}

Шаблон соответствует пробелу, за которым следует любое количество «словных символов» ( \ w ), то есть буквы (значки), цифры и символы подчеркивания, а затем заменяет эту последовательность только пробелом, первой буквой и точка.

Возможные изменения:

  • If you only want to match uppercase letters from A-Z like in your example, replace \w with [A-Z].
  • If you want to match anything that is not a space (i.e. "MÜLLER-RIEBENSEE" => "M."), replace \w with \S (non-whitespace).
  • If you want to have other characters than the space as separator, use character class and subpattern for it too for example: preg_replace('/([\s-])(\w)\w*/', '$1$2.', $name) to take any whitespace character \s or the dash - as separator (i.e. "MÜLLER-RIEBENSEE" => "M.-R.")
0
добавлено
Я предложил некоторые варианты относительно вероятных особых случаев, см. Обновленный ответ.
добавлено автор Fabian Schmengler, источник
извините, я имею в виду регулярное выражение ...
добавлено автор Andika, источник

Я не знаю, что вы имеете в виду под «make delimiter», но вот решение на основе регулярных выражений:

function shorten_name($name) {
    return preg_replace('/ (\w)\w*/', ' $1.', $name);
}

Шаблон соответствует пробелу, за которым следует любое количество «словных символов» ( \ w ), то есть буквы (значки), цифры и символы подчеркивания, а затем заменяет эту последовательность только пробелом, первой буквой и точка.

Возможные изменения:

  • If you only want to match uppercase letters from A-Z like in your example, replace \w with [A-Z].
  • If you want to match anything that is not a space (i.e. "MÜLLER-RIEBENSEE" => "M."), replace \w with \S (non-whitespace).
  • If you want to have other characters than the space as separator, use character class and subpattern for it too for example: preg_replace('/([\s-])(\w)\w*/', '$1$2.', $name) to take any whitespace character \s or the dash - as separator (i.e. "MÜLLER-RIEBENSEE" => "M.-R.")
0
добавлено
Я предложил некоторые варианты относительно вероятных особых случаев, см. Обновленный ответ.
добавлено автор Fabian Schmengler, источник
извините, я имею в виду регулярное выражение ...
добавлено автор Andika, источник

Это простое решение, которое можно легко превратить в функцию.

$name = 'THERESIA PUDJI ASTUTIE SARI';

//split the name to a maximum of 2 array values.
list ($first_name, $second_names) = explode(' ', $name, 2);

$second_names = explode(' ', $second_names);

foreach ($second_names as $key => $value) {
    $second_names[$key] = $value[0] . '.';
}

echo $first_name . ' ' . implode(' ', $second_names);
0
добавлено
спасибо ... это работа ...
добавлено автор Andika, источник

Это простое решение, которое можно легко превратить в функцию.

$name = 'THERESIA PUDJI ASTUTIE SARI';

//split the name to a maximum of 2 array values.
list ($first_name, $second_names) = explode(' ', $name, 2);

$second_names = explode(' ', $second_names);

foreach ($second_names as $key => $value) {
    $second_names[$key] = $value[0] . '.';
}

echo $first_name . ' ' . implode(' ', $second_names);
0
добавлено
спасибо ... это работа ...
добавлено автор Andika, источник
phpGeeks
phpGeeks
3 620 участник(ов)

Best PHP chat Еще: @dbGeeks - базы данных @phpGeeksJunior - новичкам @moscowProgers - IT Москва @ebanoePhp - весёлый канал о PHP @laravel_pro - Laravel @jobGeeks - вакансии @jsChat - JS Правила: https://t.me/phpGeeks/764859 ДР - 28.03.2016

PHP
PHP
1 309 участник(ов)

Группа про современный PHP. Обсуждаем ООП, TDD, BDD, DDD, SOLID, GRASP и прочие крутые базворды Для ознакомления: https://gist.github.com/mkusher/711bd46f0b62fbae851182e6fb3b1839 Группа PHP для новичков @phpGeeksJunior Вакансии: https://t.me/fordev

PHP — вакансии, поиск работы и аналитика
PHP — вакансии, поиск работы и аналитика
1 251 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению PHP, Laravel, Symfony, Yii и т.д. Здесь всё: full-time, part-time, remote и разовые подработки. См. также: @qa_jobs, @devops_jobs, @javascript_jobs, @nodejs_jobs, @uiux_jobs, @products_jobs

phpGeeksJunior
phpGeeksJunior
980 участник(ов)

Группа для новичков. Не стесняйтесь задавать вопросы по php. Не флудить!!!! Правила и полезные ссылки https://gist.github.com/exileed/a53dd0617b35a705ff44b38c8028e6a5 Бест от пхпгикс https://t.me/best_of_phpgeeks

phpclub.ru
phpclub.ru
872 участник(ов)

Официальный чат phpclub.ru - остерегайтесь подделок #rules Правила группы - уважайте друг друга. Скриншоты -> ссылками. Код -> pastebin.com. Вакансии строго -> https://goo.gl/4bNxym, в чат ссылку. За рекламу и мат - БАН!

Devall | PHP
Devall | PHP
272 участник(ов)

Пристанище для восходящих звёзд разработки, которые перейдут на более адекватные языки. http://combot.org/chat/-1001014863761 Инвайт: j.mp/devallphp