Этот ответ берет вопрос буквально: только касается пробелов и вкладок. Конечно, 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 characters указать начало и конец предмета, вместо типичного ^
и $
, которые являются линией ориентированных meta-characters. Это не так, потому что они необходимы в этом случае столько же, сколько «защитное» программирование, если значение S
изменится, чтобы сделать их нужными в будущем.
Теперь для секретного соуса: мы собираемся воспользоваться некоторой специальной семантикой preg_replace, а именно (курсив добавлен)
Если количеством элементов в замене массива, чем в массив шаблонов, любые дополнительные шаблоны будут заменены пустой строкой.
function trim_press($data){
return preg_replace([ M, L, R ], [ T ], $data);
}
Таким образом, вместо шаблона строка и строка замены, мы используем массив шаблона и замену массив, что приводит в дополнительных шаблонах L
и R
быть обрезанными.
Вы пытаетесь удалить * все * вкладки независимо от того, хотите ли вы, чтобы колонка поддерживала форматирование? – Synetech
Я думаю, вы должны переоценить ответы и принять другой. – Jeff