Проблема регулярного выражения полосы кода HTML - PullRequest
2 голосов
/ 05 сентября 2010

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

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>

Ответы [ 3 ]

4 голосов
/ 05 сентября 2010

Вы используете не жадный модификатор .

(?:.|\s)*?
         ^

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

<b>This would be bold</b>
^-^                  ^--^     Non-greedy: <(?:.|\s)*?>
^-----------------------^     Greedy    : <(?:.|\s)*>
2 голосов
/ 05 сентября 2010

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

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

Чтобы выполнить reedy match (самое длинное возможное совпадение), удалите ?:

var reTag = /<(?:.|\s)*>/g; 
1 голос
/ 05 сентября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...