Замена пробелов с помощью регулярного выражения в PHP

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

Вопрос

Я новичок в регулярных выражениях.У меня есть требование заменить пробелы в многострочном тексте.Правила замены таковы:

  • Замените все пробелы в начале строки неразрывным пробелом ( ).
  • Замените любой экземпляр повторяющихся пробелов (более одного пробела вместе) таким же количеством неразрывных пробелов.
  • Отдельные пробелы, не находящиеся в начале строки, остаются нетронутыми.

Я использовал Тренер по регулярным выражениям чтобы построить соответствующий шаблон:

/( ){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)/", "&#160;", $str);

(Я выбрал № 160, поскольку уценка анализирует nbsp.)

Результаты:

asdasd asdasd&#160;&#160;asdas1
&#160;asda234 4545&#160;&#160;&#160;&#160;54
&#160;&#160;34545 345&#160;&#160;34534
34 345

Для получения дополнительной информации проверьте ПКРЕ и перлр.


отвечать на комментарии

@Спрогз:Сначала я подумал то же самое.Но пример показывает "\n " => "\n&nbsp;" между 1-й и 2-й строками.

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

Вы можете использовать PHP /e модификатор для выполнять некоторый код в замене, например:

$str = preg_replace('/( {2,}|^ )/em', 'str_repeat("&nbsp;", strlen("\1"))', $str);

Я изменил регулярное выражение, чтобы зафиксировать пробелы.А /m modifer переводит его в многострочный режим, поэтому ^ соответствует началу любой строки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top