如何使正则表达式的名称缩写


How to make regex for name abbreviation

我有像这个这样的原始数据

原始数据:

  • 斯里兰卡
  • 戴安娜
  • 恩当华育PURWANINGSIH
  • 特蕾西娅·普吉·阿斯图蒂·萨里

我需要这样展示:

查看数据:

  • SRI
  • 黛安娜
  • 恩当W.P
  • 那里有P.A

如何使用PHP和正则表达式实现这一点?

这是一个简单的解决方案,可以很容易地转换为函数。

$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);

假设$var具有要转换的字符串。

$var = "THERESIA PUDJI ASTUTIE SARI";
$parts = explode(" ", $var);
$str = $parts[0]." ";
for($i=1; $i<count($parts); $i++){
    $str .= $parts[$i][0].". ";
}
echo $str will give you desired output.

我不知道"make delimiter"是什么意思,但这里有一个基于正则表达式的解决方案:

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

该模式匹配后面跟着任意数量的"单词字符"('w)的空格,即字母(区域设置)、数字和下划线,然后仅用空格、第一个字母和一个点替换此序列。

可能的修改:

  • 如果您只想像示例中那样匹配A-Z中的大写字母,请将'w替换为[A-Z]
  • 如果要匹配任何非空格的内容(即"MÜLLER-RIEBENSEE"=>"M"),请将'w替换为'S(非空格)
  • 如果您希望使用空格以外的其他字符作为分隔符,也可以使用字符类和子模式,例如:preg_replace('/(['s-])('w)'w*/', '$1$2.', $name)以任何空白字符's或短划线-作为分隔符(即"MÜLLER-RIEBENSEE"=>"M.-R")