2010-09-05 5 views
2

В javascript одним из популярных регулярных выражений является выделение HTML-тегов из текста. Код, которыйHTML code strip regexp problem

String.prototype.stripHTML = function() { 
      var reTag = /<(?:.|\s)*?>/g; 
      return this.replace(reTag, ""); 
     }; 

Если вы попробуете это на "<b>This would be bold</b>".stripHTML(), то он выдает в качестве "This would be bold". Должен ли он выводиться как ""?

Разве это регулярное выражение не говорит о том, что соответствует всем, что начинается с < и заканчивается >? Почему это не регулярное выражение начинается в < из <b> и заканчивается в > из </b>

+1

Если у вас использовать функцию stripHTML, подобную той, которая является acutally функцией stripTags, как в PHP. Таким образом, вы просто отлично. – 2ndkauboy

ответ

4

Вы используете модификатор non-greedy.

(?:.|\s)*? 
     ^

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

 
<b>This would be bold</b> 
^-^     ^--^  Non-greedy: <(?:.|\s)*?> 
^-----------------------^  Greedy : <(?:.|\s)*> 
1

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

2

Да, но *? выполняет ungreedy матч (короткий матч):

var reTag = /<(?:.|\s)*?>/g; 

Для выполнения пронзительный матч (самый длинный матч возможно), удалить ?:

var reTag = /<(?:.|\s)*>/g;