2011-04-06 77 views
1

您好,我需要为contentEditable div中的某些文本着色。假设我需要用蓝色突出显示+。在keyup事件中,我做了以下$textarea.html($textarea.html().replace((/-/))/g,"<span class='blue'>$1</span>") 这个明显的问题是不止一次(因为我有keyup事件)在同一部分中被替换。我只能使用该类型的事件关键事件。这个怎么做?谢谢在字符串的相同部分排除正则表达式

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

+4

我不明白这个问题。不过,我喜欢你的头像。 – 2011-04-06 13:42:11

+0

这个问题:http://stackoverflow.com/questions/5331644/regex-to-search-html-return-but-not-actual-html-jquery/5403731#5403731 – 2011-04-06 13:55:00

+0

我更新了我的问题 – 2011-04-06 14:06:40

回答

2

,因为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 

即使你多次运行它。

+0

感谢,即时解决它现在,但它看起来像硬编码,认为有更优雅的方式。 – 2011-04-06 14:42:43

0

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

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

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

jsFiddle

+0

看到我更新的问题,请 – 2011-04-06 14:02:11

2

有一两件事你可以尝试是一种消极的前瞻,是这样的:

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

任何匹配 “ - ” 后面没有通过 “</SPAN >” 。在你替换了一个特定的短划线之后,它不应该在下一个键盘上被替换。这有点破解,但我认为它满足您的要求。

+0

你真的尝试过吗?它根本不起作用。 – Toto 2011-04-06 14:48:53

+0

对不起,在我的iPad床上,所以我没有创建一个测试用例,但我尝试regexpal.com的正则表达式,以确保它匹配正确。 – 2011-04-06 14:58:28

+0

哦,等等,我没有逃过正则表达式的正斜杠;这可能是问题所在。改变了(虽然还没有测试:仍然在床上!) – 2011-04-06 14:59:39

相关问题