【问题标题】:JavaScript regex to replace a character ignoring HTML tagsJavaScript正则表达式替换忽略HTML标签的字符
【发布时间】:2010-07-30 16:12:04
【问题描述】:

再次,我需要一些帮助,感谢大家愿意在这里提供帮助。
我正在尝试为 JavaScript 函数实现一个正则表达式,该函数将替换 HTML 标记中包含的一串文本,但完全忽略该标记。
例如:
我需要查找和替换的字符串是美元符号 ($), 我正在使用的 HTML 如下所示:

<div class="myClass">
    <input type="radio" value="$233.93" name="myInput" id="myInputId">
    <label>
        $36.<sup>07</sup>
    </label>
</div>

如您所见,我在 input 标签的 value 属性中有一个美元金额,在 label 标签内还有另一个美元金额。
所有这些 HTML 都包含在一个 td(表格单元格)中,该单元格又​​是表格的一部分,我正在为此实现按列排序的功能。
我的问题是我无法想出一个完全忽略 HTML 标签并仅匹配标签标签 ($36.&lt;sup&gt;07&lt;/sup&gt;) 中的字符串的正则表达式。
我把这个正则表达式放在一起:/[$](?=(\d{2,5}[.&lt;]))/
这个正则表达式有效,但只有一半,因为它匹配 value 属性值中的第一个美元符号,授予它未设置为全局的正则表达式,因为它将替换所有美元符号,我不想这样做那,我也不能改变 HTML 的结构。

任何帮助将不胜感激。 谢谢

【问题讨论】:

  • +1 为琥珀色,不要使用正则表达式来解析 html
  • 我想我错了,我不是在尝试用正则表达式解析 HTML,而是在尝试提取一个值并针对正则表达式进行测试。是一样的吗?
  • jnkrois,您应该编辑您的标题+帖子以阐明您正在尝试做的什么,而不是您认为可能会如何完成。

标签: javascript jquery html regex


【解决方案1】:

你可以用 jQuery 轻松解决这个问题:

jQuery.trim( jQuery('label').text() )

这将为您剥离标签,并生成$36.07,然后您可以使用更简单的正则表达式对其进行测试。


(如果您当前没有使用 jQuery,并且不想使用它,您仍然可以查看它的源代码,看看他们如何实现 .text() 函数以模拟它。)


嗯,重新阅读您的问题,您可能会问其他问题 - 检索所有包含 $ 的标签(并忽略输入),您可以这样做:

jQuery('label:contains($)')

jQuery('label').each( checkForDollars );

function checkForDollars()
{
    if ( jQuery(this).text().matches(/\$\d{2,5}/) } )
    {
        // do something
    }
)

【讨论】:

  • 非jq版本:var labels=document.getElementsByTagName('label'); for (var len=labels.length, i=0; i&lt;len; i++) {var c = trim(labels[i].textContent || labels[i].innerText); if (c.charAt(0)=='$') { /* do something */ } }
  • trim 不是所有浏览器的内置函数?
  • 非常感谢,我一定会试试的。
  • @Peter...哎呀,只是在写php...是的,在javascript AFAIK中的任何地方都不存在修剪。猜猜trim 需要去,c.charAt(0)=='$' 需要成为一个正则表达式匹配。
  • 这应该可以。 var labels=document.getElementsByTagName('label'); var i=-1,v,c; while (v=labels[++i]) { c = ((v.textContent||v.innerText).match(/\$\d+(?:.\d+)?/)||[])[0]; if (c) { /* do something with c */ } } ...顺便说一句,您的正则表达式似乎有点不对...您忘记转义$,但即使转义它也只能匹配10美元或更多。如果不更改正则表达式,我认为您的答案不会起作用。
【解决方案2】:

只要金额始终采用$36.&lt;sup&gt;07&lt;/sup&gt; 之类的格式,这将起作用。

function getAmount (s) { 
  var r = /\$([^<]+)<sup>(\d+)/.exec(s); 
  return r[1]+r[2]; 
}

getAmount("$36.<sup>07</sup>");
// returns "36.07"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    • 2011-08-07
    • 2011-10-19
    • 2015-05-08
    • 1970-01-01
    相关资源
    最近更新 更多