обрезать линии и сокращать пробелы с помощью регулярных выражений для многострочной строки

яиспользую функция 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

Почему он только удаляет завершающий пробел из последней строки?

2

Решение

Вы можете переопределить где $ совпадения с использованием (*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 демо.

2

Другие решения

Используйте двухэтапный подход:

<?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.

1

Вам нужно /gm вместо просто /m

Код должен стать:
(этот код не будет работать, обновление будет)

$patterns[] = ['/ +$/mg', ''];

Рабочий пример здесь: https://regex101.com/r/z3pDre/1

Обновить:

g идентификатор, не работать так Нам нужно заменить preg_match с preg_match_all

Используйте регулярное выражение без g, как это:

$patterns[] = ['/ +$/m', ''];
1

preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )

так ты хочешь preg_replace('/[\s]+$/m', '', $string)

0
 preg_replace('/*(.*) +?\n*$/', $content)

Live Demo

0
По вопросам рекламы [email protected]