我的字符串See Good-by
我有这个匹配字符串
中的所有单词var result = $(this).text().match(/\b(\w+)\b/gi);
但它认为-
不是这个词的一部分。只要连字符和它旁边的单词之间没有空格,是否可以将连字符视为单词的一部分?
这是我的完整代码
$('.definition').each( function(p) {
var c = '';
var result = $(this).text().match(/\b[\w-]+\b/g);
$.each(result, function(i) {
if (result[i] != '') {
if ($.inArray(result[i].toLowerCase(), stopwords) === -1) {
var link = ' <a href="/dictionary/word/' + result[i].toLowerCase() + '/">' + result[i] + '</a>';
c += link;
} else {
c += " "+result[i];
}
}
})
$(this).html(c);
})
解决
我有一个我需要检查的数组中的停用词列表,因此它们不包含在链接中。这是工作代码,谢谢@Pranav C Balan
$('.definition').html(function() {
return $(this).text().replace(/\b[\w-]+\b/g, function(m){
if ($.inArray(m.toLowerCase(), stopwords) === -1) {
return ' <a href="/dictionary/word/' + m.toLowerCase() + '/">' + m + '</a>';
} else {
return " "+m;
}
});
})
答案 0 :(得分:1)
您可以使用character class将-
与字符组合。虽然此处i
标志完全没有必要,因为\w
包括小写和大写字母。
var result = $(this).text().match(/\b[\w-]+\b/g);
console.log(
'See Good-by'.match(/\b[\w-]+\b/g)
)
&#13;
更新1:我认为您在更新的代码中过度复杂化了问题。不是获取匹配的字符串并生成字符串,而是使用带有回调的String#replace
方法生成字符串。
$('.definition').each(function() {
var result = $(this).text().replace(/\b[\w-]+\b/g, function(m){
return ' <a href="/dictionary/word/' + m.toLowerCase() + '/">' + m + '</a>';
});
// or
// return $(this).text().replace(/\b[\w-]+\b/g, ' <a href="/dictionary/word/$&/">$&</a>');
$(this).html(result);
})
您甚至可以使用html()
方法使用回调来减少上述代码,该回调在元素内部进行迭代。
$('.definition').html(function() {
return $(this).text().replace(/\b[\w-]+\b/g, function(m){
return ' <a href="/dictionary/word/' + m.toLowerCase() + '/">' + m + '</a>';
});
// or
// return $(this).text().replace(/\b[\w-]+\b/g, ' <a href="/dictionary/word/$&/">$&</a>');
})
更新2 :为避免代码中出现stopwords
,请使用替换回调中的逻辑。
$('.definition').html(function() {
return $(this).text().replace(/\b[\w-]+\b/g, function(m){
return $.inArray(result[i].toLowerCase(), stopwords) === -1 ? ' <a href="/dictionary/word/' + m.toLowerCase() + '/">' + m + '</a>' : m;
});
})
或在negative lookahead assertion的帮助下将其与正则表达式一起使用。
$('.definition').html(function() {
return $(this).text().replace(new RegExp('(?!(?:' + stopwords.join('|') + ')\\b)\\b[\\w-]+\\b', 'g'), function(m){
return ' <a href="/dictionary/word/' + m.toLowerCase() + '/">';
});
})