разделять пробелы между словами из одной буквы

#php #preg-replace #strip

#php #preg-заменить #Стриптиз

Вопрос:

Как бы вы разделили пробелы между словами из одной буквы. Пример:

  • строка: «Т И Г Р У С ФУ и Дрезга д. о. о.». Нью-Йорк»
  • мы хотим: «TIGRUS FOO и Drezga d.o.o. Нью-Йорк»

Если возможно, preg_replace решение, извините, что не сказал раньше.

Комментарии:

1. я пробовал некоторые коды preg_replace, но я не продвинулся далеко, поэтому не пишу его под вопросом. Лучшие

Ответ №1:

Работает следующее.

 $string = "T I G R U S FOO and Drezga d . o . o . New York";

$words = explode(" ", $string);

$output = array();
$temp_word = "";
foreach($words as $word)
{
    if (strlen($word) == 1)
    {
        $temp_word .= $word;
    }
    else
    {
        if ($temp_word != "")
        {
            $output[] = $temp_word;
            $temp_word = "";
        }
        $output[] = $word;
    }
}

$output = implode(" ", $output);
echo $output;
  

Выводит: «TIGRUS FOO и Drezga d.o.o. Нью-Йорк»

Комментарии:

1. Строго говоря, это неправильно обработает случаи, когда вам понадобится отдельный символ сам по себе (есть несколько таких распространенных слов, и не только в английском). Но это может быть достаточно хорошо для ваших целей.

2. @Austin, хорошая мысль, о чем следует знать, если запрашивающий использует это решение.

3. Galzer спасибо, но я хотел, чтобы решение preg_replace, если это возможно, было немного неприятным, но спасибо за ваши усилия. лучший, Лука

Ответ №2:

Попробуйте этот php-код:

 <?php
   $str = "T I G R U S FOO and Drezga d . o . o . New York";
   $out = preg_replace('~(b.)s~', "\1", $str);
   var_dump($out);
?>
  

ВЫВОД

 string(38) "TIGRUSFOO and Drezga d. o. o. New York
  

Обновить

 <?php
   $str = "T I G R U S FOO and Drezga d . o . o . New York N Y";
   $s = preg_replace('~((?<=^[^s])|(?<=s[^s]))s(?=[^s](s|$))~', "", $str);
   var_dump($s);
?>
  

ВЫВОД

 string(40) "TIGRUS FOO and Drezga d.o.o. New York NY"
  

?>

Комментарии:

1. -1 Вывод не соответствует тому, что было запрошено. Ожидаемый результат: «TIGRUS FOO и Drezga d.o.o. Нью-Йорк» У вас есть дополнительный интервал между d.o.o. и отсутствует пробел между «TIGRUS» и «FOO».

2. это самое близкое решение. если бы мы только могли разрешить пробел между TIGRUS и FOO. Я думаю, это должно проверить, есть ли в следующей букве пробел в качестве следующего символа. И намного лучше, чем первый, я хотел бы справиться с этим с помощью preg_replace, если это возможно.

3. @Luka amp; @ Gazler: Пришлось выйти после публикации моего ответа сегодня. Прочитал ваши комментарии и переработал мой ответ, чтобы генерировать ожидаемое поведение на выходе, используя чистое решение для регулярных выражений. Однако IMO это регулярное выражение немного сложное, поскольку для этого требуется ввести в него некоторую логику в соответствии с вопросом OP.

4. @anubhava, понижающий голос удален, поскольку решение теперь соответствует тому, что было задано.

5. @Luka amp; @Gazler: Большое спасибо, рад, что вам обоим понравилось решение. В итоге я потратил пару часов, чтобы разобраться с этим, используя 100% решение на основе регулярных выражений 🙂

Ответ №3:

К сожалению, это невозможно. Не существует простого способа отличить границы слов с одним пробелом от посторонних пробелов между символами слова.

РЕДАКТИРОВАТЬ: Убрано — я предположил, что при замене потребуется правильно обрабатывать (т. Е. Сохранять отдельные) слова, которые на самом деле имеют длину в один символ.

Комментарии:

1. Это возможно. Прочитайте вопрос еще раз, в нем говорится «пробелы между словами из одной буквы»