在字符串的同一部分排除正则表达式

时间:2011-04-06 13:35:46

标签: javascript jquery html regex

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

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

4 个答案:

答案 0 :(得分:2)

你可以尝试的一件事是消极的前瞻,比如:

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

匹配任何“ - ”后面没有“&lt; / span&gt;”。在替换特定短划线一次后,它不应该在下一个键盘上被替换。这是一个黑客,授予,但我认为它满足您的要求。

答案 1 :(得分:2)

因为javascript不支持lookbehind断言,所以可以执行以下操作:

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 :(得分:0)

也许您可以更轻松地使用:http://codemirror.net/并为您的环境编写自定义模式。

答案 3 :(得分:0)

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

$(document).ready(function() {
    var $textarea = ...

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

jsFiddle