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


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

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

[    asdf asdf     asdf           asdf   ] 

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

[asdf asdf asdf asdf]

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

Author: JakeGould, 2009-07-25

8 answers

$data = trim(preg_replace('/\s+/g', '', $data));
 15
Author: RaYell, 2009-07-25 08:26:37

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

$data = preg_replace('/[ ]{2,}|[\t]/', ' ', trim($data));
 16
Author: ahc, 2009-07-25 08:29:34

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

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

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

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

 3
Author: cletus, 2009-07-25 08:19:07
$data = trim($data);

, который избавляется от ваших начальных (и конечных) пробелов.

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

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

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

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

 1
Author: Gabriel Hurley, 2009-07-25 08:18:29
$new_data = preg_replace("/[\t\s]+/", " ", trim($data));
 1
Author: slosd, 2009-07-25 08:22:07

Этот ответ воспринимает вопрос совершенно буквально: он касается только пробелов и вкладок. Конечно, 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 escape-символы для указания начала и конца темы вместо типичных ^ и $, которые являются линейными метасимволами . Это связано не столько с тем, что они необходимы в данном случае, сколько с "защитным" программированием, если значение S изменится, чтобы сделать их необходимыми в будущем.

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

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

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

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

 0
Author: Jeff, 2017-10-03 22:36:37

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

$data = trim(preg_replace('/\s+|nbsp;/g', '', $data));
 0
Author: Ivo Pereira, 2018-02-04 02:48:03

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

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

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

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

 -1
Author: dav, 2012-11-02 15:04:52