Видаліть зайву пробіл зсередини рядка


132

Я отримую рядок із запиту до бази даних, після чого я видаляю всі теги HTML, повернення каретки та нові рядки, перш ніж помістити його у файл CSV. Єдине, що я не можу знайти спосіб видалити зайвий пробіл між рядками.

Який найкращий спосіб видалити внутрішні символи пробілу?


6
Будь ласка, опублікуйте зразок оригінального рядка та потрібного рядка.
Zote

Чи можете ви також зрозуміти, яким повинен бути кінцевий результат? Ви вставляєте коми в дані для CSV, отримуєте їх з бази даних з комами, які вже є в ньому, вводячи рядки у функцію, яка обробляє вставлення CSV тощо?
Френк ДеРоза

ок, остаточне виведення повинно бути рядком, кожне слово відокремлене одним пробілом, на даний момент це кілька пробілів.
joepour

1
@Joe, я б не витрачав час і почав би дарувати всім тим, хто допомагав тобі раніше! :)
Френкі

Відповіді:


286

Не впевнений, що саме ви хочете, але ось дві ситуації:

  1. Якщо ви просто маємо справу з надлишком whitespaceна початок або кінець рядка , ви можете використовувати trim(), ltrim()або rtrim()видалити його.

  2. Якщо ви маєте справу з додатковими пробілами всередині рядка, вважайте preg_replaceкратне whitespaces " "*з одиничним whitespace " ".

Приклад:

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

62
$ foo = preg_replace ('/ \ s + /', '', $ foo);
genio

використання $foo = preg_replace( '/\s+/', ' ', $foo );волі вбиває наслідкиnl2br()
Вайїл Карим

1
просто використовуйте nl2br перед тим, як використовувати preg_replace, і вам слід добре поїхати.
Лукас Ліесіс

Примітка Typo / Escaper - якщо код не видаляє зайвий пробіл для вас - переконайтесь, що у вас є "\" перед "s" :), деякі сторінки онлайн-php-тестування видаліть його :)
jave.web

Це має бути безпечним для CSS, правда? Як і в цьому, це б безпечно стискало змінну, що містить довгу багаторядкову CSS-рядок?
Девід

50
$str = str_replace(' ','',$str);

Або замініть підкресленням & nbsp; тощо.


7
Це видаляє весь пробіл. Він просто хоче нормалізувати рядок.
Свенд

12
Що я шукав (хоча це не було питання)
Севенеарт

@Gigala "Що було б найкращим способом видалити внутрішні символи пробілу?" було питання. Ця відповідь це цілком задовольняє.
Cory Dee

1
@CoryDee Це правда, для останнього єдиного речення. Але у вступі питання формулюється як " зайвий пробіл", з акцентом на надлишок. Ви в кінцевому підсумку , що задовольняє Актуальною проблемою в OP, тому він не має великого значення, але до тих пір , як ми отримуємо технічний про це ...
Спенсер Раскін

Це не працює , якщо лічильник з просторів є парним числом , скажімо: Hi Earthз 4 - простору між ними буде: HiEarth. Це не вирішує мою проблему, що стосується питання.
JJ Labajo

26

$str = trim(preg_replace('/\s+/',' ', $str));

Вищевказаний рядок коду видалить зайві пробіли, а також провідні та кінцеві пробіли.


25

жоден з інших прикладів не працював для мене, тому я використовував цей:

trim(preg_replace('/[\t\n\r\s]+/', ' ', $text_to_clean_up))

це замінює всі вкладки, нові рядки, подвійні пробіли тощо на простий 1 пробіл.


Дякую, @ wp78de, але з будь-якої причини у мене виникли проблеми з просто \s+. Хоча це було ще в 2014 році, тому, можливо, воно було змінено, не торкалися PHP протягом останніх 3 років, не можу коментувати, але залишатимуть поточну відповідь, поки це було рішенням, і, можливо, все ще є в деяких випадках.
Лукас Ліесіс

9

Якщо ви хочете замінити лише кілька пробілів у рядку, наприклад: "this string have lots of space . " І ви очікуєте, що відповідь буде такою "this string have lots of space", ви можете використовувати таке рішення:

$strng = "this string                        have lots of                        space  .   ";

$strng = trim(preg_replace('/\s+/',' ', $strng));

echo $strng;

5

Існують недоліки в застосуванні preg_replace (), якщо ви отримуєте корисне навантаження від введення користувача [або інших ненадійних джерел]. PHP виконує регулярний вираз з eval (). Якщо вхідний рядок не буде належним чином очищений, ваша програма ризикує зазнати введення коду .

У своєму власному додатку, замість того, щоб перешкоджати санітарному введенню (і, як я маю справу лише з короткими рядками), я натомість зробив трохи більш інтенсивну процесорну функцію, хоча і безпечну, оскільки вона нічого не зводить ().

function secureRip(string $str): string { /* Rips all whitespace securely. */
  $arr = str_split($str, 1);
  $retStr = '';
  foreach ($arr as $char) {
    $retStr .= trim($char);
  }
  return $retStr;
}

Він виконує його лише за допомогою eval, якщо ви вказали модифікацію 'e': php.net/manual/en/…, вона також говорить про те, що «Ця функція була ВИМОЖЕНО в PHP 5.5.0 і знищена з PHP 7.0.0. " Таким чином, ви більше не можете оцінювати речі в preg_replace.
ADJenks


2

Ви можете використовувати:

$str = trim(str_replace("  ", " ", $str));

Це видаляє зайві пробіли з обох сторін рядка і перетворює два пробіли в один всередині рядка. Зауважте, що це не перетворить три чи більше пробілів у ряд! Ще один спосіб, який я можу запропонувати, - це використовувати безпечніші, але безпечніші, але абсолютно не оптимальні!

$str = implode(" ", array_filter(explode(" ", $str)));

Моя пропозиція - це використання нативного для циклу або використання регулярного виразу для виконання подібної роботи.


Це не перетворює кілька просторів правильно, коли простір довший двох пробілів.
mikeybeck

1

Щоб розширити відповідь Сандіпа, у мене з'явилася купа рядків, що відображаються в журналах, які були неправильно закодовані в bit.ly. Вони мали намір кодувати лише URL-адресу, але після пробілу поставили ручку щебетання та деякі інші речі. Це виглядало так

? productID =26%20via%20@LFS

Зазвичай це не буде проблемою, але я отримую багато спроб введення SQL, тому я переспрямовую все, що не є дійсним ідентифікатором, на 404. Я використовував метод preg_replace, щоб перетворити недійсний рядок productID в дійсний продуктID.

$productID=preg_replace('/[\s]+.*/','',$productID);

Я шукаю пробіл у URL-адресі, а потім видаляю все після нього.


0

Нещодавно я написав просту функцію, яка видаляє зайвий пробіл із рядка без регулярного вираження implode(' ', array_filter(explode(' ', $str))).


-1
$str = "I      am a PHP   Developer";
$str_length = strlen($str);
$str_arr = str_split($str);
for ($i = 0; $i < $str_length; $i++) {
   if (isset($str_arr[$i + 1])  && $str_arr[$i] == ' ' && $str_arr[$i] == $str_arr[$i + 1]) {
       unset($str_arr[$i]);
   } 
   else {
     continue;
   }
}
echo implode("", $str_arr);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.