Есть ли возможность отделить специальные символы от слов с помощью regex / preg_split? - PullRequest
3 голосов
/ 23 января 2020

Я младший, и с regex мне не по себе, и я пытаюсь создать генератор паролей с предложениями, используя regex и preg_split.

Все сделано, кроме одной вещи, например, предложение "У меня есть 2 кошки". должен выглядеть как «I'vg2 c.» но единственное, что у меня есть, это «Ig2 c», потому что я разделяю пробелами (preg_split("/[\s]|/", $string, -1, PREG_SPLIT_NO_EMPTY);), и действительно, между словами и специальными символами нет пробелов.

Так есть ли какая-нибудь "простая" опция, позволяющая отделить специальные символы от слов и сохранить их, используя regex / preg_split или что-то еще? : s (Не знаю, если я ясно, извините за мой английский sh)

Вот код:

session_start();


$string = !empty($_POST['sentence']) ? $_POST['sentence'] : NUll;

function initiales($string)
{
  $words = preg_split("/[\s]/", $string, -1, PREG_SPLIT_NO_EMPTY);
  // $words = explode(" ", $string);
   $initiale = '';
   foreach($words as $init){
     $initiale .= $init{0};
   }
  return $initiale;
}
?>



What I want : 

input: initiales("I've got 21 cats and 1 dog!");

expected_output: "I'vg21ca1d!"

unexpected_output: "Ig2ca1d"


1 Ответ

1 голос
/ 24 января 2020

Вы можете использовать

function initiales($string) { 
    return preg_replace('#\B\p{L}\p{M}*+|\s+#u', '', $string); 
}

См. PHP демо

Шаблон соответствует

  • \B\p{L}\p{M}*+ - любой буква не в начале слова + любые диакритические знаки после него
  • | - или
  • \s+ - 1 или более пробелов.

The * Модификатор 1021 * используется для сопоставления с любым пробелом Unicode и делает \B Unicode осведомленным.

...