Як можна зняти пробіли у змінній PHP?


79

Я знаю цей коментар PHP.net. Я хотів би мати подібний інструмент, як trдля PHP, такий, щоб я міг запускати просто

tr -d " " ""

Я біжу безуспішно функція php_strip_whitespaceвід

$tags_trimmed = php_strip_whitespace($tags);

Я також безуспішно запускаю функцію регулярного виразу

$tags_trimmed = preg_replace(" ", "", $tags);


1
@taztodgmail Подивіться на дати. Це 2009 рік, а інший - 2013. 2013 рік є дублікатом цього.
Лео Леопольд Герц 준영

1
FYI: прапор \ S не входить UTF-8 символів , такі як UTF-8 закодованих Nbsp;, пс, квадроциклів і FS stackoverflow.com/questions/2227921 / ...
ppostma1

1
звичайно! У мене є набір коду, який його
адресує

Чому це з’являється на першій сторінці?
Джонатан дос Сантос,

Відповіді:


48

Регулярний вираз не враховує символи UTF-8 за замовчуванням. \sМета-символ рахунок тільки для оригінального латинського набору. Отже, наступна команда видаляє лише вкладки, пробіли, повернення каретки та нові рядки

// http://stackoverflow.com/a/1279798/54964
$str=preg_replace('/\s+/', '', $str);

Коли UTF-8 стане основним, цей вираз частіше виходить з ладу / зупиняється, коли досягає нових символів utf-8, залишаючи пробіли позаду, що \sнеможливо врахувати.

Щоб мати справу з новими типами пробілів, введеними в unicode / utf-8, потрібен більш обширний рядок, який відповідає і видаляє сучасний пробіл.

Оскільки регулярні вирази за замовчуванням не розпізнають багатобайтові символи, для їх ідентифікації можна використовувати лише розділений мета-рядок, щоб запобігти змінам сегментів байтів в інших символах utf-8 ( \x80у наборі чотирьох символів може замінити всі \x80підбайти у розумних цитатах)

$cleanedstr = preg_replace(
    "/(\t|\n|\v|\f|\r| |\xC2\x85|\xc2\xa0|\xe1\xa0\x8e|\xe2\x80[\x80-\x8D]|\xe2\x80\xa8|\xe2\x80\xa9|\xe2\x80\xaF|\xe2\x81\x9f|\xe2\x81\xa0|\xe3\x80\x80|\xef\xbb\xbf)+/",
    "_",
    $str
);

Це враховує та видаляє вкладки, нові рядки, вертикальні вкладки, подачі форми, повернення каретки, пробіли та додатково звідси :

наступний рядок, нерозривні пробіли, монгольський роздільник голосних, [en quad, em quad, en space, em space, простір на три символи, пробіл на чотири символи, простір на шість символів, простір фігур, розділові знаки , тонкий простір, простір для волосся, простір нульової ширини, столяр нульової ширини, столяр нульової ширини], роздільник рядків, роздільник абзаців, вузький пробіл без розривів, середній математичний простір, столяр слова, ідеографічний простір та нульова ширина не- розриву простору.

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

[Більше не безпечно копіювати та вставляти з Інтернету. Використовуйте сканер символів, щоб захистити свій код. Лол]


1
Так? Я намагався пояснити, що старий вже працює не так, як мав би зараз
ppostma1

Відмінно! Чи можете ви, будь ласка, включити кількість символів, які у вас є у вашому наборі? - - Це допоможе нам визначити, що у вас справді є повний набір цих персонажів. - - Я прийняв вашу відповідь, оскільки вона тепер повніша, ніж стара прийнята відповідь.
Лео Леопольд Герц, 준영

Дякуємо за допомогу @Masi!
ppostma1

1
Дякую, АЛЕ використання trim()має бути правильною відповіддю
Хусам

1
Чи не повинен бути uпрапор у регулярному виразі?

133

Щоб зняти будь-який пробіл, можна використовувати регулярний вираз

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

Дивіться також цю відповідь щодо того, що може обробляти пробіли в рядках UTF-8.


Будь-які інші рішення. Це (preg_replace) для мене не вдається.
Катір

Катір, з яким входом це не вдається?
Алекс

Чому люди продовжують ставити +після s? Для цього вам не потрібно.
Buttle Butkus

2
Це на порядок швидше, ніж замінювати їх по одному, ось чому :)
Пол Діксон,

1
Здається, ви намагаєтесь вирішити іншу проблему, ніж OP. Це рішення для видалення пробілів із рядка.
Пол Діксон,

26

Іноді вам потрібно буде видалити послідовні пробіли. Ви можете зробити це так:

$str = "My   name    is";
$str = preg_replace('/\s\s+/', ' ', $str);

Вихід:

My name is

Дякую. Саме те, що я шукав
lomse


8

Ви можете використовувати функцію обрізки з php, щоб обрізати обидві сторони (ліву та праву)

 trim($yourinputdata," ");

Або

trim($yourinputdata);

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

ltrim() - Removes whitespace or other predefined characters from the left side of a string
rtrim() - Removes whitespace or other predefined characters from the right side of a string

Система: PHP 4,5,7
Документи: http://php.net/manual/en/function.trim.php


1
Це повинна бути правильна відповідь, як це робиться спочатку, саме те, що вимагає ОП. Він невеликий, чистий і `` розширюваний '', додаючи додатковий шар, який потрібно обрізати.
Louis Loudog Trottier

Обрізання не видаляє пробіли ВНУТРИ рядка, лише зліва та праворуч. До речі, пробіл за замовчуванням у

6

Якщо ви хочете видалити всі пробіли скрізь із $ тегів, чому б не просто:

str_replace(' ', '', $tags);

Якщо ви хочете видалити нові рядки та такі, що потребують трохи більше ...


2
якщо ви не призначите результат змінній, це насправді не зробить нічого корисного.
Пол Діксон,

Пол Діксон, що таке змінна? Я програмую, але не знаю, що таке змінна ... Для чого це корисно? Чи можу я знайти це в Інтернеті? Важливо знати, що це означає? Чому вони ставлять $ перед назвою?
Я хочу знати

2

Будь-який можливий варіант - використовувати спеціальну обгортку файлів для імітації змінних як файлів. Ви можете досягти цього, використовуючи це:

1) Перш за все, зареєструйте свою обгортку (лише один раз у файлі, використовуйте її як session_start ()):

stream_wrapper_register('var', VarWrapper);

2) Потім визначте свій клас обгортки (він дуже швидко написаний, не повністю коректний, але працює):

class VarWrapper {
  protected $pos = 0;
  protected $content;
  public function stream_open($path, $mode, $options, &$opened_path) {
    $varname = substr($path, 6);
    global $$varname;
    $this->content = $$varname;
    return true;
  }
  public function stream_read($count) {
    $s = substr($this->content, $this->pos, $count);
    $this->pos += $count;
    return $s;
  }
  public function stream_stat() {
    $f = fopen(__file__, 'rb');
    $a = fstat($f);
    fclose($f);
    if (isset($a[7])) $a[7] = strlen($this->content);
    return $a;
  }
}

3) Потім використовуйте будь-яку функцію файлу з вашою обгорткою на протоколі var: // (ви також можете використовувати її для включення, вимагання тощо):

global $__myVar;
$__myVar = 'Enter tags here';
$data = php_strip_whitespace('var://__myVar');

Примітка: Не забувайте, що ваша змінна має глобальний обсяг (наприклад, глобальний $ __ myVar)


Це складно, новачки можуть не захотіти поглянути на це. Але за проявлені зусилля я підтримую вас так, що -1 у цьому дописі буде видалено
Ironwind

1
Так, я знаю, що це дуже складно, але це працює, і в деяких випадках це дійсно потужно. І, на жаль, це єдиний спосіб (замість створення Tempfiles, що некрасиво), як надіслати змінну до функцій, які працюють лише з файлами (і php_strip_whitespace не єдиний). Наприклад, ви можете замінити код перед тим, як вимагати - ви можете створити власний "попередній компілятор" для PHP, де ви можете робити все, що завгодно. Я використовую його, і він стає дуже потужним і корисним протягом багатьох років програмування.
micropro.cz

global $$varname;Як жахливо було в 2013 році
B001 ᛦ

1

Ви можете зробити це за допомогою ereg_replace

 $str = 'This Is New Method Ever';
 $newstr = ereg_replace([[:space:]])+', '',  trim($str)):
 echo $newstr
 // Result - ThisIsNewMethodEver

ereg застарілий з PHP 5.3

1

Ви також використовуєте preg_replace_callbackфункцію. і ця функція ідентична своєму побратиму, preg_replaceза винятком того, що вона може приймати функцію зворотного виклику, яка дає вам більше контролю над тим, як ви маніпулюєте вашим результатом.

$str = "this is a   string";

echo preg_replace_callback(
        '/\s+/',
        function ($matches) {
            return "";
        },
        $str
      );

1
Доброю практикою на Stack Overflow є додавання пояснення, чому ваше рішення має працювати. Для отримання більш докладної інформації читайте як відповісти .
Семюель Ліу

Чи можете ви додати приклади, в яких випадках корисний зворотний дзвінок preg_replace?
Лео Леопольд Герц 준영


1

Це стара публікація, але найкоротша відповідь тут не вказана, тому я додаю її зараз

strtr($str,[' '=>'']);

Іншим поширеним способом «зняти шкіру з цього кота» було б використовувати вибух і імплодію таким чином

implode('',explode(' ', $str));


0

Це стара публікація, але її можна зробити так:

if(!function_exists('strim')) :
function strim($str,$charlist=" ",$option=0){
    $return='';
    if(is_string($str))
    {
        // Translate HTML entities
        $return = str_replace(" "," ",$str);
        $return = strtr($return, array_flip(get_html_translation_table(HTML_ENTITIES, ENT_QUOTES)));
        // Choose trim option
        switch($option)
        {
            // Strip whitespace (and other characters) from the begin and end of string
            default:
            case 0:
                $return = trim($return,$charlist);
            break;
            // Strip whitespace (and other characters) from the begin of string 
            case 1:
                $return = ltrim($return,$charlist);
            break;
            // Strip whitespace (and other characters) from the end of string 
            case 2:
                $return = rtrim($return,$charlist);
            break;

        }
    }
    return $return;
}
endif;

Стандартні функції trim () можуть бути проблематичними, коли з’являються сутності HTML. Ось чому я написав функцію "Супер обрізання", що використовується для вирішення цієї проблеми, а також ви можете вибрати обрізання з початку, кінця або сторони кабіни рядка.


0

Простий спосіб видалити пробіли з цілого рядка - це використовувати функцію вибуху та надрукувати весь рядок, використовуючи цикл for.

 $text = $_POST['string'];
            $a=explode(" ", $text);
            $count=count($a);
            for($i=0;$i<$count; $i++){

                echo $a[$i];
            }

0

Аргумент регулярного виразу \ s не сумісний із багатобайтовими рядками UTF-8.

Цей PHE RegEx - це той, який я написав, щоб вирішити це за допомогою аргументів на основі PCRE (Perl-сумісних регулярних виразів) як заміну рядків UTF-8:

function remove_utf8_whitespace($string) { 
   return preg_replace('/\h+/u','',preg_replace('/\R+/u','',$string)); 
}

- Приклад використання -

До:

$string = " this is a test \n and another test\n\r\t ok! \n";

echo $string;

 this is a test
 and another test
         ok!

echo strlen($string); // result: 43

Після:

$string = remove_utf8_whitespace($string);

echo $string;

thisisatestandanothertestok!

echo strlen($string); // result: 28

Перелік аргументів PCRE

Джерело: https://www.rexegg.com/regex-quickstart.html

Character   Legend  Example Sample Match
\t  Tab T\t\w{2}    T     ab
\r  Carriage return character   see below   
\n  Line feed character see below   
\r\n    Line separator on Windows   AB\r\nCD    AB
    CD
\N  Perl, PCRE (C, PHP, R…): one character that is not a line break \N+ ABC
\h  Perl, PCRE (C, PHP, R…), Java: one horizontal whitespace character: tab or Unicode space separator      
\H  One character that is not a horizontal whitespace       
\v  .NET, JavaScript, Python, Ruby: vertical tab        
\v  Perl, PCRE (C, PHP, R…), Java: one vertical whitespace character: line feed, carriage return, vertical tab, form feed, paragraph or line separator      
\V  Perl, PCRE (C, PHP, R…), Java: any character that is not a vertical whitespace      
\R  Perl, PCRE (C, PHP, R…), Java: one line break (carriage return + line feed pair, and all the characters matched by \v)      

0

Існують деякі спеціальні типи пробілів у вигляді тегів. Вам потрібно використовувати

$str=strip_tags($str);

видалити зайві теги, теги помилок, щоб спочатку дістатися до звичайного рядка.

І використовувати

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

Це робота для мене.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.