Мне нужно удалить пустые строки (с пробелами или абсолютно пустыми) в PHP. Я использую это регулярное выражение, но оно не работает:
$str = ereg_replace('^[ \t]*$\r?\n', '', $str); $str = preg_replace('^[ \t]*$\r?\n', '', $str);
я хочу результат:
blahblah blahblah adsa sad asdasd
будем:
blahblah blahblah adsa sad asdasd
// New line is required to split non-blank lines preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n", $string);
Вышеупомянутое регулярное выражение говорит:
/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/ 1st Capturing group (^[\r\n]*|[\r\n]+) 1st Alternative: ^[\r\n]* ^ assert position at start of the string [\r\n]* match a single character present in the list below Quantifier: Between zero and unlimited times, as many times as possible, giving back as needed [greedy] \r matches a carriage return (ASCII 13) \n matches a fine-feed (newline) character (ASCII 10) 2nd Alternative: [\r\n]+ [\r\n]+ match a single character present in the list below Quantifier: Between one and unlimited times, as many times as possible, giving back as needed [greedy] \r matches a carriage return (ASCII 13) \n matches a fine-feed (newline) character (ASCII 10) [\s\t]* match a single character present in the list below Quantifier: Between zero and unlimited times, as many times as possible, giving back as needed [greedy] \s match any white space character [\r\n\t\f ] \tTab (ASCII 9) [\r\n]+ match a single character present in the list below Quantifier: Between one and unlimited times, as many times as possible, giving back as needed [greedy] \r matches a carriage return (ASCII 13) \n matches a fine-feed (newline) character (ASCII 10)
ereg-replace()
неверно, потому что ereg/eregi
устарели. Ваш preg_replace()
даже не будет компилироваться, но если вы добавите разделители и установите многострочный режим, он будет работать нормально:
$str = preg_replace('/^[ \t]*[\r\n]+/m', '', $str);
Модификатор m
позволяет ^
соответствовать началу логической строки, а не только началу всей строки. Якорь начала строки необходим, потому что без него регулярное выражение будет соответствовать новой строке в конце каждой строки, а не только пустым. Вам не нужен привязку конца строки ( $
), потому что вы активно сопоставляете символы новой строки, но это не повредит.
Принятый ответ выполняет свою работу, но это сложнее, чем нужно. Регулярное выражение должно совпадать либо с началом строки ( ^[\r\n]*
, либо с многострочным режимом, либо не с одной новой линией ( [\r\n]+
), за которой следует, по крайней мере, одна новая строка ( [\r\n]+
). Итак, в специальном случае строки, которая начинается с одной или нескольких пустых строк, они будут заменены одной пустой строкой. Я почти уверен, что это не желаемый результат.
Но то, что он делает большую часть времени, – это замена двух или нескольких последовательных строк новой строки вместе с любыми горизонтальными пробелами (пробелами или вкладками), которые находятся между ними, с одной линией. Во всяком случае, это намерение. Кажется, что автор ожидает, что \s
будет соответствовать просто символу пробела ( \x20
), когда на самом деле он соответствует любому символу пробела. Это очень распространенная ошибка. Фактический список варьируется от одного аромата регулярного выражения до следующего, но, как минимум, вы можете ожидать, что \s
будет соответствовать любому [ \t\f\r\n]
совпадению.
На самом деле, в PHP у вас есть лучший вариант:
$str = preg_replace('/^\h*\v+/m', '', $str);
\h
соответствует любому горизонтальному символу пробела, а \v
соответствует вертикальному пробелу.
Просто взорвите строки текста в массив, удалите пустые строки с помощью array_filter
и снова array_filter
массив.
$tmp = explode("\n", $str); $tmp = array_filter($tmp); $str = implode("\n", $tmp);
Или в одной строке:
$str = implode("\n", array_filter(explode("\n", $str)));
Я не знаю, но это может быть быстрее, чем preg_replace
.
Комментарий от Bythos от ссылки Джейми выше работал для меня:
/^\n+|^[\t\s]*\n+/m
Я не хотел снимать все новые строки, просто пустые / пробельные. Это делает трюк!
как насчет этого?
$str = preg_replace('^\s+\r?\n$', '', $str);
Попробуй это:
$str =preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\r\n", $str);
Если вы выведете это в текстовый файл, он будет выдавать одинаковый вывод на простой блокнот, Wordpad, а также на текстовые редакторы, например Notepad ++.
function trimblanklines($str) { return preg_replace('`\A[ \t]*\r?\n|\r?\n[ \t]*\Z`','',$str); }
Этот только удаляет их от начала и до конца, а не от середины (если кто-то еще искал это).
Принятый ответ оставляет дополнительный прерывание строки в конце строки. Использование rtrim()
приведет к удалению этой последней строки:
rtrim(preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n", $string));
Из этого ответа работайте отлично для меня!
$str = "<html> <body>"; echo str_replace(array("\r", "\n"), '', $str);