2013-08-21 3 views
3

Мне нужно обернуть числа внутри тегов HTML, не затрагивая атрибуты.Регулярное выражение для поиска чисел внутри HTML-тегов

До сих пор все, что я мог бы получить выбирает то, что внутри тега только цифры, так и не цифровые символы тоже :(

Вот регулярное выражение я использую:

/([0-9]+(?:\.[0-9]*)?)/g

Here's the code at RegExr !

Я буду использовать JQuery разобрать его. This is the closest I could get jsfiddle.

Как сделать это регулярное выражение только для чисел внутри html-тегов?

Благодарим за помощь.

+14

[Не использовать регулярное выражение.] (Http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags) Используйте парсер DOM и перемещайте текст узлы - тогда применить замену только на тех. –

+1

** Не используйте регулярные выражения для анализа HTML. Используйте подходящий модуль синтаксического анализа HTML. ** Вы не можете надежно проанализировать HTML с регулярными выражениями, и вы столкнетесь с печалью и разочарованием в будущем. Как только HTML изменится с ваших ожиданий, ваш код будет сломан. См. Http://htmlparsing.com/php для примеров того, как правильно анализировать HTML с PHP-модулями, которые уже были написаны, протестированы и отлажены. –

+0

Угадайте, что это может быть более точно. Как направить jQuery на просмотр только на текстовых узлах? Это может сделать регулярное выражение более эффективным. –

ответ

1

Это соответствует 123 в <div>123</div>, например:

[0-9]+(?:\.[0-9]*)|(?<=^|>)\d+(?=<|$) 

Это регулярное выражение было отредактировано по ссылке вы предоставили: http://regexr.com/?361gc

+0

Спасибо, но это еще не номера выбора. –

0

Это выбирает только цифры внутри HTML-тегов. Он также работает с многострочным текстом.

(?!<[A-Z][A-Z0-9]*\b[^><]*>[^><0-9]*)([0-9]+)(?=[^><0-9]*<) 

Вы можете проверить его here.

Но, пожалуйста, имейте в виду, что теги <html> и <body> соответствуют шаблону, который вы просили, поэтому, когда вы запускаете полный html-документ через это регулярное выражение, большинство или все числа будут сопоставляться.

Тестирование на ваш код на jsfiddle я изменил его к этому:

$('body').each(function() { 
    $(this).html(function(i, v) { 
     return v.replace(/(?!<[A-Z][A-Z0-9]*\b[^><]*>[^><0-9]*)([0-9]+)(?=[^><0-9]*<)/gim, '<span>$1</span>'); 
    }); 
}); 

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

+0

То же самое, он все еще не выбирает числа. –

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