2014-05-22 2 views
0

Позвольте сказать, что у меня есть полное имя: Wan Ahmad Wan Dollah Karmat.Как заменить слова после первых двух слов

И я хочу, чтобы отобразить как: Ван Ахмад WDK

Я попробовал этот код:

preg_replace('/(.)[^\s]+\s?/', '${1}.', strtoupper($_GET['fullname']), 2) 

Но выход: Wawan Dollah Karmat

Я хочу, чтобы первые два слова и короче остальных слов. пожалуйста помоги.

Проблема решена, благодаря Casimir et Hippolyte. Конечный код:

preg_replace('~^(?:\s*\S+){1,2}(*SKIP)(*FAIL)|(\S)\S+~', '${1}.', strtoupper($_GET['fullname'])) 

его вопрос об узорах.

ответ

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) заставляет шаблон потерпеть неудачу.

+0

Я пробовал это: preg_replace ('~^\ s * \ S + \ s + \ S + (* SKIP) (* FAIL) | (\ S) \ S ++ ~', '$ {1}.', Strtoupper ($ _GET ['fullname'])) его работа для нескольких слов, но его также заменить, если одно слово. например: Wan и output: W. – user3613026

+0

@ user3613026: Хорошо, я отредактирую шаблон, чтобы справиться с этим случаем. –

+0

спасибо. В любом случае, как я могу определить, будут ли изменения в будущем? есть ли разделитель или что-то в этом роде. поэтому его будет легко редактировать позже. например: первые 3 слова и т. д. – user3613026

Смежные вопросы