Правильный синтаксис для замены нескольких вхождений на PHP preg_replace - PullRequest
0 голосов
/ 05 февраля 2010

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

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

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

Ожидаемое возвращаемое выражение будет:

Foo\nbar!\nfoobar!

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

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

Спасибо!

Ответы [ 3 ]

3 голосов
/ 05 февраля 2010

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

$text = "Foo\n\r\n\n\rbar!\n\nfoobar!";
$text = preg_replace('#(\r\n|\r|\n)+#m', "\n", $text);
echo $text;
1 голос
/ 05 февраля 2010
$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 
0 голосов
/ 05 февраля 2010

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

Вот что в итоге произошло. У меня был тег 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 ... [source]

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

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

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

...