PHP中的正则表达式:将字符串中第一个单词之后的所有单词截断,并将所有单词截断为第一个字符

Unfulvio

我对正则表达式非常恐惧。

我有一个字符串,其中可能包含1个或多个单词(通常为2个或3个),通常是人名,例如:

$str1 = 'John Smith';
$str2 = 'John Doe';
$str3 = 'David X. Cohen';
$str4 = 'Kim Jong Un';
$str5 = 'Bob';

我想将每个转换如下:

$str1 = 'John S.';
$str2 = 'John D.';
$str3 = 'David X. C.';
$str4 = 'Kim J. U.';
$str5 = 'Bob';

我的猜测是,我应该首先匹配第一个单词,如下所示:

preg_match( "^([\w\-]+)", $str1, $first_word )

然后是第一个单词之后的所有单词...但是我该如何匹配呢?我应该再次使用preg_match并在参数中使用offset = 1吗?但是偏移量是以字符或字节为单位的,对不对?

无论如何,当我匹配第一个单词之后的单词(如果存在)之后,我应该为它们中的每个单词做些什么,例如:

$second_word = substr( $following_word, 1 ) . '. ';

还是我的方法是完全错误的?

谢谢

ps-如果字符串包含三个或更多单词,则正则表达式可以保留整个前两个单词将是一个福音……(例如'Kim Jong U.')。

阿努巴瓦

可以preg_replace使用正则表达式单个完成

您可以使用此正则表达式进行搜索:

^\w+(?:$| +)(*SKIP)(*F)|(\w)\w+

并替换为:

$1.

正则演示

代码:

$name = preg_replace('/^\w+(?:$| +)(*SKIP)(*F)|(\w)\w+/', '$1.', $name);

解释:

  • (*FAIL) 表现像失败的否定断言,并且是的同义词 (?!)
  • (*SKIP) 定义一个点,稍后当子模式失败时,不允许正则表达式引擎回溯
  • (*SKIP)(*FAIL) 一起提供了一个很好的限制选择,即您不能在上面的正则表达式中留有可变长度。
  • ^\w+(?:$| +)(*SKIP)(*F) 匹配名称中的第一个单词并跳过它(不执行任何操作)
  • (\w)\w+ 匹配所有其他单词,并将其替换为第一个字母和一个点。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

Related 相关文章

热门标签

归档