заменить несколько пробелов в строке одним пробелом

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

 $s = preg_replace("/( *)/", " ", $x);

мой файл очень прост. Вот часть его:

Hjhajhashsh dwddd dddd sss   ddd wdd ddcdsefe xsddd   scdc yyy5ty    ewewdwdewde           wwwe ddr3r dce eggrg               vgrg fbjb   nnn  bh jfvddffv mnmb   weer ffer3ef f4r4 34t4 rt4t4t 4t4t4t4t    ffrr  rrr  ww w w ee3e iioi   hj   hmm  mmmmm mmjm lk ;’’ kjmm  ,,,, jjj hhh  lmmmlm m mmmm lklmm jlmm m

4 ответов


ваше регулярное выражение заменяет любой количество мест (в том числе ноль) С пробелом. Вы должны заменить только два или более (в конце концов, замена одного пробела на себя бессмысленна):

$s = preg_replace("/ {2,}/", " ", $x);

то, что я обычно делаю, чтобы очистить несколько пространств:

while (strpos($x, '  ') !== false) {
   $x = str_replace('  ', ' ', $x);
}

условия/гипотезы:

  1. строки с несколькими пробелами встречаются редко
  2. два пространства гораздо более распространены, чем три или более
  3. preg_replace дорого с точки зрения CPU
  4. копировать символы в новую строку, следует избегать, когда это возможно

конечно, если условие №1 не выполняется, такой подход не имеет смысла, но это обычно быть.

если #1 выполняется, но ни один из других не выполняется (это может зависеть от данных, программного обеспечения (версия PHP) или даже аппаратного обеспечения), то следующее Может быть быстрее:

if (strpos($x, '  ') !== false) {
   $x = preg_replace('/  +/', ' ', $x); // i.e.: '/␣␣+/'
}

в любом случае, если несколько пробелов появляются только, скажем, в 2% ваших строк, важно профилактическая проверка с strpos, и вы, вероятно, не очень заботитесь об оптимизации оставшихся 2% случаев.


// Ваш вклад $ул = "Hjhajhashsh dwddd дддд ССС ДДД-ый WDD ddcdsefe xsddd scdc yyy5ty ewewdwdewde wwwe ddr3r АКД eggrg vgrg fbjb ННН ЧД jfvddffv mnmb вере ffer3ef f4r4 34t4 rt4t4t 4t4t4t4t ffrr ррр ЖВ ж ж ee3e iioi и HJ хм ммммм mmjm ЛК ;’ kjmm ,,,, ююю ННН lmmmlm м мммм lklmm jlmm м"; ул. Эхо $.'
';

    $output = preg_replace('!\s+!', ' ', $str); // Replace multispace with sigle.

    echo $output;

попробуйте следующее:

$output = preg_replace('/\s+/', ' ',$string);