2008-10-16 6 views
3

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

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

Я использовал 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 

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

ответ

6

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

Или, найдите место (\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-й строками.

+0

Хороший ответ, но стоит ли менять ваше предложение на использование \ s, поскольку это были только последовательности пробелов, которые хотел задать для замены, и \ s, конечно, будут включать в себя табуляции, новые строки, возврат каретки и несколько других с включенными определенными настройками.Я бы пошел с/(? <= \ X20) \ x20 | \ x20 (? = \ X20) |^\ x20/ – Sprogz 2008-10-16 11:03:17

+0

Спасибо!/(? <= \ x20) \ x20 | \ x20 (? = \ x20) |^\ x20/с «m» в конце отлично работает! – 2008-10-16 12:24:49

2

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

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

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