яиспользую функция php хочу создать функцию, чтобы обрезать все ненужные пробелы из многострочной строки.
Регулярное выражение, которое это не работает, является тем, которое удаляет пробелы в конце:
// Always trim at the end. Warning: this seems to be the costlier
// operation, perhaps because looking ahead is harder?
$patterns[] = ['/ +$/m', ''];
Учитывая следующую строку из текстовой области:
first line... abc //<-- blank space here
second is here... def //<-- blank space here
//<-- blank space here
fourth line... hi there //<-- blank space here
sith is here.... //<-- blank space here
В начале и конце каждой строки есть пробелы, а также более одного слова.
После того, как я запустил функцию:
$functions->trimWhitespace($description, ['blankLines' => false]);
Вот что я получаю:
first line... abc //<-- blank space here
second is here... def //<-- blank space here
//<-- no bank space here
fourth line... hi there //<-- blank space here
sith is here....//<-- no blank space here
Почему он только удаляет завершающий пробел из последней строки?
Вы можете переопределить где $
совпадения с использованием (*ANYCRLF)
глагол.
Смотрите следующее PHP демо:
$s = " ddd \r\n bbb ";
$n = preg_replace('~(*ANYCRLF)\h+$~m', '', $s); // if the string can contain Unicode chars,
echo $n; // also add "u" modifier ('~(*ANYCRLF)\h+$~um')
подробности:
(*ANYCRLF)
— определяет соглашение новой строки: (*CR)
, (*LF)
или же (*CRLF)
\h+
— 1+ горизонтальный пробельные символы$
— конец строки (сейчас, до CR или LF)~m
— многострочный режим включен ($
совпадения в конце строки).Если вы хотите разрешить $
чтобы соответствовать в любом разрыве строки Unicode, заменить (*ANYCRLF)
с (*ANY)
,
Увидеть Newline conventions
в PCRE ссылка:
(*CR) carriage return
(*LF) linefeed
(*CRLF) carriage return, followed by linefeed
(*ANYCRLF) any of the three above
(*ANY) all Unicode newline sequences
Теперь, если вам нужно
использование
$s = " Ł ę d \r\n Я ёb ";
$n = preg_replace('~(*ANYCRLF)^\h+|\h+$|(\h){2,}~um', '$1', $s);
echo $n;
Увидеть PHP демо.
Используйте двухэтапный подход:
<?php
$text = " first line... abc
second is here... def
<-- blank space here
fourth line... hi there
sith is here.... ";
// get rid of spaces at the beginning and end of line
$regex = '~^\ +|\ +$~m';
$text = preg_replace($regex, '', $text);
// get rid of more than two consecutive spaces
$regex = '~\ {2,}~';
$text = preg_replace($regex, ' ', $text);
echo $text;
?>
Увидеть демо на ideone.com.
Вам нужно /gm
вместо просто /m
Код должен стать:
(этот код не будет работать, обновление будет)
$patterns[] = ['/ +$/mg', ''];
Рабочий пример здесь: https://regex101.com/r/z3pDre/1
Обновить:
g
идентификатор, не работать так Нам нужно заменить preg_match
с preg_match_all
Используйте регулярное выражение без g
, как это:
$patterns[] = ['/ +$/m', ''];
preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
так ты хочешь preg_replace('/[\s]+$/m', '', $string)
preg_replace('/*(.*) +?\n*$/', $content)