2015-03-18 2 views
2

Я хочу, чтобы превратить это:Как сопоставить новые строки как один?

Lorem ipsum dolor sit amet 

Ipsum dolor sit amet, consetetur 
eirmod tempor invidunt ut labore 

в этом:

<p>Lorem ipsum dolor sit amet</p> 

<p>Ipsum dolor sit amet, consetetur 
eirmod tempor invidunt ut labore</p> 

Для достижения этой цели я разделил пункты, применяется регулярное выражение, и, наконец, снова присоединился к ним:

data = data.split('\n\n') 
for (var i = 0; i < data.length; ++i) { 
    data[i] = data[i].replace(/(.+)/g, '<p>$1</p>') 
} 
data = data.join("") 

К сожалению, этот результат следующий:

<p>Lorem ipsum dolor sit amet</p><p>Ipsum dolor sit amet, consetetur</p> 
<p>eirmod tempor invidunt ut labore</p> 

Каждая строка абзаца рассматривается как один абзац.

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

+0

regexes по умолчанию работают на основе строки. после '' consetetur' '' \ n', '' (. +) 'перестает соответствовать. Попробуйте добавить многострочный флаг: '/(.+)/ gm'. –

+0

Использовать 'data.join (" \ n \ n ")' –

+0

@Marc B Странно, я добавил 'm'. По-прежнему получается тот же результат. – alexchenco

ответ

5

Вам нужно регулярное выражение? Это тоже должно работать.

for (var i = 0; i < data.length; ++i) { 
    data[i] = '<p>' + data[i]+ '</p>'; 
} 
0

Я обычно использую [\ s \ S], чтобы соответствовать любому символу, включают символ новой строки, так что моя модификация:

for (var i = 0; i < data.length; ++i) { 
    data[i] = data[i].replace(/([\s\S]+)/g, '<p>$1</p>'); 
} 
+0

Я не хочу включать новую строку. – alexchenco

2

Использование регулярных выражений вы можете сделать:

data = date.replace(/^(\S[\s\S]+?)(?=\n\n|$(?!\n))/gm, '<p>$1</p>'); 

RegEx Demo

+0

Ницца. Есть ли преимущества в использовании цикла 'for', как и я? Или это одно и то же? – alexchenco

+0

Я считаю, что это намного меньше кода и проще понять. Что касается эффективности, я думаю, что оба подхода будут более или менее одинаковыми. – anubhava

Смежные вопросы