Ваше решение 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
соответствует вертикальному пробелу.