2010-04-11 2 views
0

Мне нужно изменить фон всего текста, который имеет два пробела от начала строки.RegEx (php) - объединить строки в многострочной замене

text 

shold быть преобразованы в "<div class='special'>text</div>"

Это легко:

$text = preg_replace("|^ (.+)|um", "<div class='special'>$1</div>", $text); 

Но

line1 
    line2 

Преобразуется

<div class='special'>line1</div> 
<div class='special'>line2</div> 

Хотя

<div class='special'>line1 
line2</div> 

необходим.

Как это можно достичь?

ответ

0

Заменить

((?:^ [^\r\n]*(?:\R(?= ))?)+) 

с <div class='special'>$1</div>.

Но это будет конвертировать

line1 
    line2 

к этому:

<div class='special'> line1 
    line2</div> 

Если вы хотите удалить пробелы, вы должны соответствовать тексту, удалить пробелы, а затем заменить.

1

Вы хотите использовать модификатор шаблона «s» (DOTALL), чтобы вы могли захватывать несколько строк. Тогда остановить жадность, сопоставляя "новой строки следует нечто иное, чем в двух пространствах"

<?PHP 
$text = " 
    Line One 
    Line Two 
    Line Three 
something"; 

$text = preg_replace("|^ (.+)^[^()]|ums", "<div class='special'>$1</div>\n", $text); 


echo $text; 

Выходы:

<div class='special'>Line One 
    Line Two 
    Line Three 
</div> 
+0

Ваше регулярное выражение не во многих случаях. (. +) заставит его соответствовать чему-либо после двух пробелов, если заканчивается «новой линией, за которой следует что-то, кроме двух пробелов». – tiftik

+0

Пока я стрелял из бедра, я думаю, это именно то, что просит Цяо. Как вы читаете это требование? – timdev

+0

"изменить фон всего текста, который имеет два пробела от начала строки". Ну, ваше решение меняет строки, которые не начинаются с двух пробелов в этом случае: «asdf \ n1234 \ n5678». – tiftik