我对正则表达式非常恐惧。
我有一个字符串,其中可能包含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] 删除。
我来说两句