Замена пробелов с помощью регулярного выражения в PHP
-
03-07-2019 - |
Вопрос
Я новичок в регулярных выражениях.У меня есть требование заменить пробелы в многострочном тексте.Правила замены таковы:
- Замените все пробелы в начале строки неразрывным пробелом (
). - Замените любой экземпляр повторяющихся пробелов (более одного пробела вместе) таким же количеством неразрывных пробелов.
- Отдельные пробелы, не находящиеся в начале строки, остаются нетронутыми.
Я использовал Тренер по регулярным выражениям чтобы построить соответствующий шаблон:
/( ){2,}|^( )/
Предположим, у меня есть этот входной текст:
asdasd asdasd asdas1
asda234 4545 54
34545 345 34534
34 345
Используя функцию замены регулярного выражения PHP (например, preg_replace()
), я хочу получить этот результат:
asdasd asdasd  asdas1
 asda234 4545    54
  34545 345  34534
34 345
Я рад выполнять простые замены текста с использованием регулярных выражений, но у меня возникают проблемы с тем, как заменить несколько раз внутри совпадения, чтобы получить желаемый результат.
Решение
Я предполагаю, что было бы легче найти каждое место и заменить его.Для этого используйте группы «просмотр вперед» и «просмотр назад».
Или найдите пробел (\x20
), который либо начинается, либо сопровождается любым одиночным пробелом (\s
);но замените только пробел.
$str = "asdasd asdasd asdas1\n asda234 4545 54\n 34545 345 34534\n34 345\n";
print preg_replace("/(?<=\s)\x20|\x20(?=\s)/", " ", $str);
(Я выбрал № 160, поскольку уценка анализирует nbsp.)
Результаты:
asdasd asdasd  asdas1
 asda234 4545    54
  34545 345  34534
34 345
Для получения дополнительной информации проверьте ПКРЕ и перлр.
отвечать на комментарии
@Спрогз:Сначала я подумал то же самое.Но пример показывает "\n " => "\n "
между 1-й и 2-й строками.
Другие советы
Вы можете использовать PHP /e
модификатор для выполнять некоторый код в замене, например:
$str = preg_replace('/( {2,}|^ )/em', 'str_repeat(" ", strlen("\1"))', $str);
Я изменил регулярное выражение, чтобы зафиксировать пробелы.А /m
modifer переводит его в многострочный режим, поэтому ^
соответствует началу любой строки.