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

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

Фактически, что-то, что бы включить эти входные данные:

[    asdf asdf     asdf           asdf   ] 

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

[asdf asdf asdf asdf]

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

Ответы

Ответ 1

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

Ответ 2

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

$data = preg_replace('/[ ]{2,}|[\t]/', ' ', trim($data));

Ответ 3

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

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

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

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

Ответ 4

$new_data = preg_replace("/[\t\s]+/", " ", trim($data));

Ответ 5

$data = trim($data);

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

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

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

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

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

Ответ 6

Этот ответ принимает вопрос полностью буквально: он касается только пробелов и вкладок. Конечно, 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.

Ответ 7

Если вам нужно также удалить  .

$data = trim(preg_replace('/\s+|nbsp;/g', '', $data));

Ответ 8

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

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

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

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