2013-08-21 47 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从你的期望改变,你的代码就会被破坏。有关如何使用已经编写,测试和调试的PHP模块正确解析HTML的示例,请参阅http://htmlparsing.com/php。 –

+0

猜猜它可能更精确。如何指示jQuery只查看文本节点?这可能会使正则表达更有效。 –

回答

0

这将选择html标签内唯一的数字:

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

这正则表达式是从您提供的链接编辑。它也适用于多行文本。

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

您可以测试它here

但是请注意,<html><body>标签将符合您要求的模式,所以当您通过此正则表达式运行完整的html文档时,大部分或全部数字都会匹配。所以,现在它只能运行在身体的元素,而不是整个文件

$('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>'); 
    }); 
}); 

测试上jsfiddle你的代码我改成了这一点。这是否给出了预期的结果?

+0

同样,它仍然不会仅选择数字。 –