Правильный синтаксис для замены нескольких вхождений на PHP preg_replace

StackOverflow https://stackoverflow.com/questions/2205619

  •  18-09-2019
  •  | 
  •  

Вопрос

Я рассматривал другие вопросы из stack overflow с аналогичными идеями, но ни один из них, похоже, недостаточно похож на то, что я пытаюсь сделать.

Кажется простым, но я в затруднительном положении.Я пытаюсь заменить несколько вхождений разрыва строки (\n) только с одним переносом строки, поэтому пользователи не смогут отправлять более одного переноса строки одновременно.Вот что я пробовал.

$text = "Foo\n\n\nbar!\n\nfoobar!";
$text = preg_replace("#\n+#", "\n", $text);
echo $text;

Ожидаемый возвращаемый оператор будет следующим:

Foo\nbar!\nfoobar!

Но никакой сигары!Я попробовал несколько, но, похоже, ни один из них не сработал.

Что я делаю не так?

Спасибо!

Это было полезно?

Решение 3

Если вас интересует только решение, перейдите к последней строке.

Вот что в итоге произошло.У меня был div тег в html, который содержал определенную информацию.Когда пользователь нажимает кнопку, запускается JS-код, который преобразует это div к одному input текстовое поле и устанавливает значение этого текстового поля в качестве html исходного div-кода, заменяя при этом все вхождения <br> с \n для создания реальных разрывов строк.Затем форма была отправлена через ajax на сервер.

Когда я попытался заменить разрывы строк в PHP, ни одно из вышеприведенных предложений не помогло по той простой причине, что это не был (как ни странно) "настоящий" символ разрыва строки.То, что было отправлено на сервер, было буквальным \n.Можно подумать, что экранирование обратной косой черты в \n, как было предложено ghostdog74, решило бы проблему, но этого не произошло.Я пытался избежать этого несколькими различными способами, но, казалось, ничего не помогало.

В итоге я сослался на какой-то старый материал с регулярными выражениями и обнаружил, что:

Многие варианты также поддерживают escape-последовательность \Q...\E.Все символы между \Q и \E интерпретируются как буквенные символы.Например.\Q*\d+*\E соответствует буквальному тексту \d+.\E может быть опущен в конце регулярного выражения...Этот синтаксис поддерживается движком JGsoft, Perl, PCRE... [источник]

После этого, вот фрагмент кода, который решил мою проблему:

$text = preg_replace('#[\Q\n\E]+#', "\n", $text);

Спасибо вам всем за вашу помощь!+1 для всех :)

Другие советы

Возможно, вы также захотите проверить наличие всех трех разновидностей разрывов строк:

$text = "Foo\n\r\n\n\rbar!\n\nfoobar!";
$text = preg_replace('#(\r\n|\r|\n)+#m', "\n", $text);
echo $text;
$text = "Foo\n\n\nbar!\n\nfoobar!";
$s = split("\n+",$text);
print_r( implode("\n",$s)); #this will join the string with newline
print_r( implode("\\n",$s)); # this will have literal \n in your string 
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top