Повторяющийся литерал соответствия шаблону регулярного выражения \n

Дана литеральная строка, такая как:

Hello\n\n\n\n\n\n\n\n\n\n\n\nWorld

Я хотел бы уменьшить повторяющиеся \n до одного \n.

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

$testRegex = '/(\\n){2,}/';
$test = 'Hello\n\n\n\n\n\n\n\n\nWorld';
$test2 = preg_replace($testRegex ,'\n',$test); 
echo "<hr/>test regex<hr/>".$test2;

Я новичок в PHP, не новичок в регулярных выражениях, но кажется, что '\n' соответствует специальным правилам. Я все еще пытаюсь их прибить.

Редактировать: я поместил буквальный код, который у меня есть в моем файле php, здесь, если я сделаю str_replace(), я могу добиться хороших результатов, но это, очевидно, не полное решение.


person PandemoniumSyndicate    schedule 12.07.2011    source источник


Ответы (5)


Чтобы сопоставить литерал \n с регулярным выражением, вашему строковому литералу нужны четыре обратные косые черты, чтобы создать строку с двумя обратными косыми чертами, которая интерпретируется механизмом регулярных выражений как escape для одной обратной косой черты.

$testRegex = '/(\\\\n){2,}/';
$test = 'Hello\n\n\n\n\n\n\n\n\n\n\n\nWorld';
$test2 = preg_replace($testRegex, '\n', $test);
person Ry-♦    schedule 12.07.2011

Возможно, вам нужно удвоить побег в регулярном выражении?

$pattern = "/\\n+/"

$awesome_string = preg_replace($pattern, "\n", $string);
person Chris    schedule 12.07.2011

Изменить. Просто прочитайте свой комментарий к принятому ответу. Не применимо, но все же полезно.

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

$output = echo preg_replace('%(\s)*%', '$1', $input);

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

person Dan Lugg    schedule 14.07.2011

это действительно соответствует специальным правилам, и вам нужно добавить модификатор «многострочный», м.б. Таким образом, ваш шаблон будет выглядеть

$pattern = '/(\n)+/m'

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

Поскольку вы пытаетесь сократить все новые строки до одной, приведенный выше шаблон должен работать с остальной частью вашего кода. Удачи!

person moritz    schedule 12.07.2011
comment
Это 100% неверное руководство. Модификатор шаблона m не имеет ничего общего с новыми строками. Флаг m абсолютно бесполезен, если шаблон не содержит ^ или $ (якорные символы). Я должен DV этот пост, потому что он дезинформирует/запутает исследователей. stackoverflow.com/q/35771159/2943403 - person mickmackusa; 25.06.2020

Попробуйте это регулярное выражение:

/[\n]*/

person The Mask    schedule 12.07.2011