【问题标题】:How can I filter matches inside a specific tag?如何过滤特定标签内的匹配项?
【发布时间】:2011-10-11 18:11:49
【问题描述】:

我正在尝试替换使用 TinyMCE 增强的输入字段中出现的所有文本,每次用户按下空格键时都会发生这种情况(类似于 Word 中的自动更正功能)。

我遇到的问题是当替换的字符串包含触发器时,它会一次又一次地替换它。 例如用

替换“你好”
<span class="replaced">hello world</span>

它将再次替换为

<span class="replaced"><span class="replaced">hello world</span> world</span>

所以我必须编写一个正则表达式来过滤掉已经被替换的文本中的匹配项。

你能帮帮我吗?

这是我当前的代码:

for (r in autocorrect_replacements) {
  if (newHtml.indexOf(autocorrect_replacements[r][0]) > -1) {
    replacement_html = '<span class="replaced">'+autocorrect_replacements[r][1] + '</span>';
    newHtml = newHtml.replace(autocorrect_replacements[r][0],replacement_html);
    ed.setContent(newHtml);
}

我不喜欢正则表达式,但我认为在这种情况下这是正确的解决方案。

【问题讨论】:

  • 你有没有考虑过使用类似 jQuery 的文档模型解析,而不是正则表达式?
  • 假设我执行类似 dom = $(ed.getContent()); 的操作,以便在每次用户按下空格键时都由 jQuery 解析,并且假设它并不慢,我会得到什么,现在我必须在该 DOM 中搜索所有不是 .replaced 的字符串并在那里应用替换,例如:dom.find(":not[.replaced]") 然后使用替换进行迭代......它可能有效,但我担心它的性能不会足够长文本和大量替换。
  • RegExp 是错误的解决方案,jQuery 在处理文本节点方面没有多大帮助。您应该遍历 DOM,并在每个文本节点上进行替换。 StackOverflow 上有很多关于这个问题的问题。无论您做什么,都不要再做您当前正在做的全面 HTML 替换。
  • 我不确定您的关键字是什么以及替换是什么,但为什么不只对光标之前的文本进行替换?
  • 代码骑师:¿我怎么知道光标在哪里?

标签: javascript regex autocorrect


【解决方案1】:

获取跨度的正则表达式是/&lt;span class="replaced"&gt;.*&lt;\/span&gt;/。不确定它是否是正确的解决方案。

你可以这样做:

for (r in autocorrect_replacements) {
  if (newHtml.indexOf(autocorrect_replacements[r][0]) > -1) {
        if (!(/<span class="replaced">.*<\/span>/.test(autocorrect_replacements[r][1]))){
            replacement_html = '<span class="replaced">'+autocorrect_replacements[r][1] + '</span>';
            newHtml = newHtml.replace(autocorrect_replacements[r][0],replacement_html);
            ed.setContent(newHtml);
        }
}

【讨论】:

    猜你喜欢
    • 2016-09-11
    • 1970-01-01
    • 2016-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-26
    • 2015-12-17
    • 1970-01-01
    相关资源
    最近更新 更多