Как удалить одиночные символьные слова из строки с preg_replace

Учитывая следующий ввод –

"I went to 1 ' and didn't see p" 

, что является регулярным выражением для функции preg_replace PHP, чтобы удалить все одиночные символы (и оставшиеся пробелы), чтобы выход был –

"went to and didn't see".

Я искал решение для этого, но не могу его найти. Подобные примеры не включали объяснений регулярного выражения, поэтому я не смог адаптировать их к моей проблеме. Поэтому, пожалуйста, если вы знаете, как это сделать, укажите регулярное выражение, но также сломайте его, чтобы я мог понять, как это работает.

ура

Попробуй это:

 $output = trim(preg_replace("/(^|\s+)(\S(\s+|$))+/", " ", $input)); 
  • (^|\s+) означает «начало строки или пространства (ов)»
  • (\s+|$) означает «конец строки пространства (ов)»
  • \S – одиночный непространственный символ

попробуйте это регулярное выражение

 '\s+\S\s+' -> ' ' 

попробуйте с помощью array_filter и array_filter

 $str ="I went to 1 ' and didn't see p"; $arr = explode(' ',$str); function singleWord($var) { if(1 !== strlen($var)) return $var; } $final = array_filter($arr,'singleWord'); echo implode(' ',$final); //return "went to and didn't see"(length=19) 

Вам понадобится два прохода

Первый – снять все одиночные символы

 (?<=^| ).(?=$| ) replace with empty string 

Второй – оставить только отдельные пробелы

 [ ]{2,} replace with single space 

В итоге вы получите строку, которая может содержать пробелы в начале или в конце. Я бы просто обрезал это с помощью вашего языка вместо того, чтобы делать это с помощью регулярного выражения

Например, первое регулярное выражение записывается в php подобно

 $result = preg_replace('/(?<=^| ).(?=$| )/sm', '', $subject);