Замена пробелов с помощью регулярных выражений в PHP - PullRequest
3 голосов
/ 16 октября 2008

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

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

Я использовал Regex Coach , чтобы построить соответствующий шаблон:

/( ){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

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

Ответы [ 2 ]

6 голосов
/ 16 октября 2008

Я предполагаю, что было бы легче найти каждый пробел и заменить его. Для этого используйте группы «упреждения» и «упреждения».

Или найдите пробел (\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

Для получения дополнительной информации, проверьте PCRE и perlre .


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

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

2 голосов
/ 16 октября 2008

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

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

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

...