Как заменить вкладки пробелами в переменных в PHP?

$data содержит табуляции, начальные пробелы и несколько пробелов. Я хочу заменить все вкладки пробелом. Несколько пробелов с одним пробелом и удалите начальные пробелы.

На самом деле что-то, что превратило бы эти входные данные:

[    asdf asdf     asdf           asdf   ] 

В выходные данные:

[asdf asdf asdf asdf]

Как мне это сделать?


person Arthur    schedule 25.07.2009    source источник
comment
Вы пытаетесь удалить все вкладки или у вас есть желание сохранить форматирование столбцов?   -  person Synetech    schedule 14.01.2013
comment
Я думаю, вам следует пересмотреть ответы и принять другой.   -  person Jeff    schedule 04.10.2017


Ответы (9)


Обрежьте, замените вкладки и лишние пробелы одинарными пробелами:

$data = preg_replace('/[ ]{2,}|[\t]/', ' ', trim($data));
person ahc    schedule 25.07.2009
comment
Во-первых, это неуклюжий узор. Во-вторых, как вы написали, он не сканирует повторно, поэтому он будет создавать несколько пробелов для запуска tab space tab space tab space. Вы проверяли это? - person Jeff; 04.10.2017

Предполагая, что квадратные скобки не являются частью строки, и вы просто используете их в иллюстративных целях, тогда:

$new_string = trim(preg_replace('!\s+!', ' ', $old_string));

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

Примечание. Я также предполагаю, что вы не хотите заменять "AB\t\tCD" (\t – вкладка) на "AB CD".

person cletus    schedule 25.07.2009
comment
Это должен быть принятый ответ. Я опубликовал свой ответ только для того, чтобы опровергнуть ваше утверждение о том, что обрезка с помощью preg_replace сложна. - person Jeff; 04.10.2017
comment
Ответ красоты. Спасибо. - person mghhgm; 02.02.2018

$data = trim($data);

Это избавит вас от ваших ведущих (и конечных) пробелов.

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

Это превращает любой набор из одного или нескольких пространств в одно пространство.

$data = str_replace("\t", " ", $data);

Это избавит вас от вкладок.

person Gabriel Hurley    schedule 25.07.2009
comment
Если вы используете \s, вам не нужно \t - person Jeff; 03.10.2017

Этот ответ воспринимает вопрос буквально: он касается только пробелов и вкладок. Конечно, OP вероятно также хочет включить другие виды пробелов в то, что обрезается/сжимается, но давайте представим, что он хочет сохранить внедренные CR и/или LF .

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

define( 'S', '[ \t]+'      ); # Stuff you want to compress; in this case ONLY spaces/tabs
define( 'L', '/\A'.S.'/'   ); # stuff on the Left edge will be trimmed
define( 'M',   '/'.S.'/'   ); # stuff in the Middle will be compressed
define( 'R',   '/'.S.'\Z/' ); # stuff on the Right edge will be trimmed
define( 'T', ' '           ); # what we want the stuff compressed To

Мы используем \A и \Z экранирующие символы, чтобы указать начало и конец предмета вместо типичных ^ и $, ориентированных на строку мета- символов. Это не столько потому, что они нужны в данном случае, сколько для «защитного» программирования, если значение S изменится, чтобы сделать их необходимыми в будущем.

Теперь секретный соус: мы воспользуемся особой семантикой preg_replace., а именно (выделение добавлено)

Если в замещающем массиве меньше элементов, чем в массиве шаблонов, все лишние шаблоны будут заменены пустой строкой.

function trim_press( $data ){
    return preg_replace( [ M, L, R ], [ T ], $data );
}

Таким образом, вместо строки шаблона и строки замены мы используем массив шаблонов и массив замещений, в результате чего лишние шаблоны L и R обрезаются.

person Jeff    schedule 03.10.2017

В случае, если вам нужно удалить   тоже.

$data = trim(preg_replace('/\s+|nbsp;/g', '', $data));
person Ivo Pereira    schedule 04.02.2018

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

$data = html_entity_decode(str_replace(' ',' ',htmlentities($data))); $data = trim(preg_replace('/\h/', ' ', $data)); // заменяет больше типов пробелов, чем \s

См. billynoah

person will    schedule 10.01.2020

Просто используйте это регулярное выражение

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

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

здесь знак + в регулярном выражении означает один или несколько раз, шаблон означает, что везде, где есть два или более пробела, замените его одним пробелом

person dav    schedule 02.11.2012
comment
минус один за шаблон, который не соответствует отдельной вкладке (и за то, что вы не тестируете свое решение перед публикацией). - person Jeff; 03.10.2017

person    schedule
comment
Вы также забыли упомянуть обрезать, чтобы избавиться от начальных пробелов. Вероятно, хочу упомянуть и ltrim, так как он попросил начальные пробелы, а затем проиллюстрировал оба конца. - person Matthew Scharley; 25.07.2009
comment
Да, спасибо, что указали на это. В примере показано, что как начальные, так и конечные пробелы должны быть удалены, поэтому я обновил свой код. - person RaYell; 25.07.2009
comment
полезный. preg_replace по умолчанию заменяет все вхождения шаблона, если вы не укажете предельный параметр. - person JustinP; 29.08.2012
comment
Модификатор g не работает. Согласно php.net/manual/en/reference.pcre. pattern.modifiers.php g не требуется для повторения в той же строке, что и весь текст, даже если он содержит новые строки, рассматривается php как одна строка - person Guillaume Bois; 01.10.2012
comment
Опечатка - вы заменяете пробелы на '', а хотели ''. - person Denis Pshenov; 11.12.2014
comment
минус один для строки замены, которая удаляет ВСЕ пробелы, даже один пробел, который хочет OP между его словами - person Jeff; 04.10.2017

person    schedule
comment
если вы используете \s, вам не нужно \t - person Jeff; 03.10.2017