Как обернуть группу слов тегами, JavaScript заменить регулярные выражения - PullRequest
6 голосов
/ 29 ноября 2009

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

Это мое регулярное выражение

/((apple|banana|cherry|orange)\b\s?)+/gi

и это моя замена:

<em>$&</em>

, который отлично подходит для моего примера текста:

Apple Banana apple cherry, Cherry orange and Oranges Apple, Banana

результат:

<em>Apple Banana apple cherry</em>, <em>Cherry orange </em>and Oranges <em>Apple</em>, <em>Banana</em>

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

т.е. мой идеальный результат будет (см. тег смещен влево после "Cherry orange"):

<em>Apple Banana apple cherry</em>, <em>Cherry orange</em> and Oranges <em>Apple</em>, <em>Banana</em>

Ответы [ 3 ]

4 голосов
/ 29 ноября 2009

JavaScript не поддерживает просмотр назад. Это позор, как мы могли бы сделать:

// doesn't work in JavaScript:
/((apple|banana|cherry|orange)\b\s?)+(?<!\s)/gi 

Однако мы можем переместить пустое пространство в начало и добавить отрицательный прогноз (поэтому улов не должен начинаться с пробела):

/(?!\s)(\s?\b(apple|banana|cherry|orange)\b)+/gi

Небольшое отличие от вашего кода в том, что я также добавил \b в начало шаблона, чтобы он не перехватывал apple из Snapple.

2 голосов
/ 29 ноября 2009

Вы можете поместить функцию в параметр замены как

function(x){return "<em>"+x.replace(/\s+$/,"")+"<em>";} вместо <em>$&</em>

и вы можете поместить чередование внутри этой функции.

"Apple Banana apple cherry, Cherry orange and Oranges Apple, Banana".replace(
/((?:apple|banana|cherry|orange)\b\s?)+/gi,
function(x){
   return "<em>"+x.replace(/\s+$/,"")+"<em>";
})

<em>Apple Banana apple cherry<em>, <em>Cherry orange<em>and Oranges <em>Apple<em>, <em>Banana<em>
0 голосов
/ 13 июня 2012

Вы также можете решить эту проблему, посмотрев в конец шаблона, чтобы убедиться, что за любым совпадением следует пробел, запятая или конец строки (это, естественно, означает, что совпадение не будет совпадать, если результат сопровождаемый письмом, которое будет иметь место в проблемном примере).

Изменен соответствующий шаблон:

/((apple|banana|cherry|orange)\b\s?)+(?=\s|,|$)/gi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...