2010-10-31 3 views
1

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

образец того, что я пытаюсь достичь:

1) пользователь посылает это сообщение:

Doctor, 
I would like to have 
an appointment tomorrow morning.Please,call me! 

2) мои форматы приложений этот текст вывода это:

Doctor, I would like to have an appointment tomorrow morning. Please, call me! 

Примечание что:

  • trai лин и ведущие пробелы должны ушли (что-то, как с помощью $.trim())
  • лишние пробелы между двумя словами, должны быть заменены одним пробелом
  • новых линий, прерывистых линий, вкладки, <br> должны быть заменены одним пробелом
  • точек и запятых должны быть отделены от следующего слова (утром. Пожалуйста, позвоните-> утром. Пожалуйста, позвоните по телефону)

Вот то, что я получил до сих пор:

text.replace(/<(.|\n\r)*?>/g, '') 
.replace(/\s/g,' ') 
.replace(/<br>/g,' ') 
.replace(/ +/g,' '); 

Было бы хорошо, чтобы объединить все выражения только в одном шаблоне. Есть ли более короткий способ сделать это?

+0

Ваш вопрос не имеет ничего общего с jquery, поэтому я обновил его, чтобы быть более общим. – mikerobi

ответ

1

В двух регулярных выражений (jsFiddle demo):

text.replace(/\s+|([.,])(?=\S)/g, '$1 ').replace(/^\s|\s$/g, '') 

разбив его, он соответствует либо:

  • Один или более пробельных символов (перевод строки, табуляция, пространство)
  • Период или запятая, за которой следует символ без пробелов (мы используем (?= положительный результат)

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

Если <br> вопросы, вы лучше с заменой, что символ пробела перед использованием вышеуказанной пары регулярных выражений (.replace(/<br>/g, ' ')), но если вы действительно хотите сделать это в то же регулярное выражение: (jsFiddle demo)

text.replace(/(?:<br>|\s)+|([.,])(?=\S)(?!<br>)/g, '$1 ').replace(/^\s|\s$/g, '') 
+0

этот '[.,]' Помог мне. Теперь я использую этот '$ (" # txtMessage "). Text ($ (" # txtMessage "). Text(). Replace (/ <(.|\n\r)*?>/g, '') .replace (/ \ s + | ([., !?)]) (? = \ S)/g, '$ 1'). Заменить (/^\ s \ \ s $/g, ''). Заменить (/ +/g, '')); –

0

Не проверял, но я считаю, что это эквивалентно:

text.replace(/^\s+|\s+$/g, '') 
    .replace(/\s+|\s*<br>\s*/g,' ') 

EDIT

Я не понимаю, почему первое выражение заменить < и >, поэтому я оставил его.

0

Возможно, но я не уверен, что это поможет уменьшить его. Регулярные выражения уже довольно трудно читать, поэтому ломать их логически может быть полезно позже, когда вы отлаживаете.

0

text.replace(/\s/g,' ') заменяет любое пространство, перевод строки, вертикальную вкладку, регулярную вкладку и пространство с пространством

.replace(/<\s*br\s*\/*\s*>/g,' ') заменяет любой <br>, <br/>, <br /> <br /> <br //> (и т.д.) с пространством

.replace(/\s{2,}/g,' ') заменяет любое двойное или более пробела пространства единое пространство

.replace(/^\s|\s$/,'') LTRIM + RTRIM (хотя из-за чередованием, производительность противном случае, он может быть лучше разделить на отдельные LTRIM и rtrims в зависимости от размера строки)

финал:

text = text.replace(/\s/g,' ').replace(/<\s*br\s*\/*\s*>/g,' ').replace(/\s{2,}/g,' ').replace(/^\s|\s$/,''); 

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

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