假设我有全名:Wan Ahmad Wan Dollah Karmat。
我希望显示如下:Wan Ahmad W.D.K
我试过这段代码:
preg_replace('/(.)[^\s]+\s?/', '${1}.', strtoupper($_GET['fullname']), 2)
但输出是:W.A.Wan Dollah Karmat
我想要前两个单词并缩短其余单词。请帮忙。
问题解决了,感谢Casimir et Hippolyte。最终的代码是:
preg_replace('~^(?:\s*\S+){1,2}(*SKIP)(*FAIL)|(\S)\S+~', '${1}.', strtoupper($_GET['fullname']))
它的模式问题。
答案 0 :(得分:0)
您可以使用回溯控制动词(*SKIP)
和(*FAIL)
来避免前两个单词。
$pattern = '~^(?:\s*\S+){1,2}(*SKIP)(*FAIL)|(\S)\S+~';
$result = preg_replace_callback($pattern,
function ($m) { return strtoupper($m[1]) . '.'; },
$_GET['fullname'] );
简而言之:
如果模式稍后失败, (*SKIP)
会强制与前一个子模式匹配的子字符串不再重试。
(*FAIL)
强制模式失败。