2009-07-25 1 views
13

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

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

[ asdf asdf  asdf   asdf ] 

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

[asdf asdf asdf asdf] 

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

+0

Вы пытаетесь удалить * все * вкладки независимо от того, хотите ли вы, чтобы колонка поддерживала форматирование? – Synetech

+0

Я думаю, вы должны переоценить ответы и принять другой. – Jeff

ответ

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

Вы также забыли упомянуть trim, чтобы избавиться от ведущих пробелов. Наверное, хочется упомянуть и об Ириме, так как он попросил начальные пробелы, а затем проиллюстрировал оба конца. –

+0

Да, спасибо, что указали это. В этом примере показано, что как ведущие, так и конечные пробелы должны быть удалены, поэтому я обновил свой код. – RaYell

+0

полезно. [preg_replace] (http://php.net/manual/en/function.preg-replace.php) по умолчанию заменяет все вхождения шаблона, если вы не укажете предельный параметр. – JustinP

1
$data = trim($data); 

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

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

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

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

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

+0

» Если вы используете '\ s', вам не нужно' \ t' – Jeff

3

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

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

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

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

+0

Это должно быть принято ответ. Я отправил свой ответ, чтобы опровергнуть ваше утверждение, что обрезка с помощью 'preg_replace' является« сложной ». – Jeff

+0

Красота ответ. Спасибо. – mghhgm

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

Если вы используете '\ s', вам не нужно' \ t' – Jeff

16

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

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

, это мне очень помогло, спасибо –

+0

Во-первых, это неуклюжий узор. Во-вторых, как вы его написали, он не повторно сканирует, и поэтому он будет создавать несколько пробелов для запуска 'tab'' space' 'tab'' space'' tab' 'space'. Вы проверили это? – Jeff

-1

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

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

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

здесь знак + в regex означает один или несколько раз, patte rn означает, что везде, где есть два или более пробела, замените его на одно пространство

+0

минус один для шаблона, который не соответствует одиночной вкладке (и для того, чтобы не тестировать ваше решение перед отправкой). – Jeff

0

Этот ответ берет вопрос буквально: только касается пробелов и вкладок. Конечно, 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 и \Zescape characters указать начало и конец предмета, вместо типичного ^ и $, которые являются линией ориентированных meta-characters. Это не так, потому что они необходимы в этом случае столько же, сколько «защитное» программирование, если значение S изменится, чтобы сделать их нужными в будущем.

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

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

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

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

0

Если вам нужно снять  .

$data = trim(preg_replace('/\s+|nbsp;/g', '', $data)); 
Смежные вопросы