$data
содержит вкладки, ведущие пробелы и несколько пробелов. Я хочу заменить все вкладки пробелом. Несколько пробелов с одним пробелом и удаление ведущих пробелов.
Фактически, что-то, что бы включить эти входные данные:
[ asdf asdf asdf asdf ]
В выходные данные:
[asdf asdf asdf asdf]
Как мне это сделать?
$data = trim(preg_replace('/\s+/g', '', $data));
Обрезать, заменить вкладки и дополнительные пробелы с помощью пробелов:
$data = preg_replace('/[ ]{2,}|[\t]/', ' ', trim($data));
Предполагая, что квадратные скобки не являются частью строки, и вы просто используете их для иллюстративных целей, тогда:
$new_string = trim(preg_replace('!\s+!', ' ', $old_string));
Возможно, вы сможете сделать это с помощью одного регулярного выражения, но это будет довольно сложное регулярное выражение. Вышеизложенное гораздо проще.
Примечание. Я также предполагаю, что вы не хотите заменять «AB \ t \ tCD» (\ t является вкладкой) с «AB CD».
$new_data = preg_replace("/[\t\s]+/", " ", trim($data));
$data = trim($data);
Это избавит вас от ваших ведущих (и конечных) пространств.
$pattern = '/\s+/'; $data = preg_replace($pattern, ' ', $data);
Это превращает любую коллекцию одного или нескольких пробелов в одно пространство.
$data = str_replace("\t", " ", $data);
Это избавит вас от ваших вкладок.
Этот ответ берет вопрос буквально: он касается только пробелов и вкладок. Конечно, 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
Мы используем escape-символы \A
и \Z
чтобы указать начало и конец объекта, а не типичные ^
и $
которые являются ориентированными на линию метасимволами . Это не так, потому что они необходимы в этом случае, как «защитное» программирование, если значение S
изменится, чтобы сделать их нужными в будущем.
Теперь для секретного соуса: мы собираемся воспользоваться некоторой специальной семантикой preg_replace , а именно (выделение добавлено)
Если в заменяющем массиве меньше элементов, чем в массиве шаблонов, любые дополнительные шаблоны будут заменены пустой строкой.
function trim_press( $data ){ return preg_replace( [ M, L, R ], [ T ], $data ); }
Поэтому вместо строки шаблона и строки замены мы используем массив шаблонов и заменяющий массив, что приводит к тому, что дополнительные шаблоны L
и R
обрезаются.
Просто используйте это регулярное выражение
$str = trim(preg_replace('/\s\s+/', ' ', $str));
он заменит все вкладки и пробелы на одно пространство,
здесь знак +
в регулярном выражении означает один или несколько раз, шаблон означает, что везде, где есть два или более пробелов, замените его на одно пространство