【问题标题】:exclude regex on the same part of string在字符串的同一部分排除正则表达式
【发布时间】:2011-04-06 13:35:46
【问题描述】:

您好,我需要对 contentEditable div 中的一些文本进行着色。假设我需要用蓝色突出显示+。在 keyup 事件中,我关注$textarea.html($textarea.html().replace((/-/))/g,"<span class='blue'>$1</span>") 替换的明显问题在搅拌的同一部分多次触发(因为我有 keyup 事件)。我只能使用那种类型的事件 keyup 事件。这个怎么做?谢谢

更新* 也许我不清楚描述我的问题。我输入“-”,然后继续输入- asdasdad。问题是每个字母后都会触发 keyup 事件(这是必须的),所以我得到了太多跨度,因为 '-' 总是在字符串中。

【问题讨论】:

标签: javascript jquery html regex


【解决方案1】:

由于 javascript 不支持后向断言,您可以执行以下操作:

var str = 'abc-def-xyz';
str = str.replace(/(<span class='blue'>)?-(<\/span>)?/g, function($0,$1,$2){ return $1?$0:"<span class='blue'>-</span>";});

输出:

abc<span class='blue'>-</span>def<span class='blue'>-</span>xyz

即使你多次运行它。

【讨论】:

  • 谢谢,我现在正在解决它,但它看起来像硬编码,认为有更优雅的方式。
【解决方案2】:

您可以尝试的一件事是负前瞻,例如:

$textarea.html($textarea.html().replace((/-(?!<\/span>/))/g,"<span class='blue'>$1</span>")

匹配任何后面没有“”的“-”。在您更换了一次特定的破折号后,它不应该在下一次按键时被更换。这有点像黑客,当然,但我认为它满足您的要求。

【讨论】:

  • 抱歉,在我床上的 iPad 上,所以我没有创建测试用例,但我尝试了 regexpal.com 中的正则表达式以确保它能够正确匹配。
  • 哦等等,我没有转义正则表达式中的正斜杠;这可能是问题所在。已更改(尽管仍未测试:仍在床上!)
【解决方案3】:

也许您更容易使用:http://codemirror.net/ 并根据您的情况编写自定义模式。

【讨论】:

    【解决方案4】:

    如果我正确理解了这个问题,您想在 jQuery keyup 事件中运行某个正则表达式替换,但只是第一次。您可以为此使用one(),让事件处理程序在首次调用后解除绑定。

    $(document).ready(function() {
        var $textarea = ...
    
        $('#somewhere').one('keyup', function() {
            $textarea.html($textarea.html().replace('-', "<span class='blue'>-</span>"));
        });
    });
    

    jsFiddle

    【讨论】:

      猜你喜欢
      • 2015-10-06
      • 1970-01-01
      • 2017-04-13
      • 2012-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-10
      相关资源
      最近更新 更多