我发现了一个非常好的代码,可以让CKeditor计算和排列文本区域中最常用的单词,这对于在写文章时提供搜索引擎优化关键字建议非常有用。问题是,当你写任何非英语字符时,比如öäåÖÄÅ,它们就不会通过某种过滤器,同样的情况也会发生在变音符号上,比如léjonet和é或ñ。
下面是代码和一个Jsfiddle演示
HTML是:
<!-- Textarea -->
<div class="form-group">
<label class="col-md-2 control-label" for="editor1">HTML </label>
<div class="col-md-10">
<textarea class="form-control" id="editor1" name="editor1"><p>text example with ahöäåra</p></textarea>
</div>
</div>
<!-- KW density result -->
<div class="form-group">
<label class="col-md-2 control-label" for="editor1">Words Repeat</label>
<div class="col-md-10">
<div id="KWdensity" ></div>
</div>
</div>
JavaScript代码是:
<script type="text/javascript">
$(document).ready(function () {
//----------------------------------------------------------------------
// Editor init
//----------------------------------------------------------------------
CKEDITOR.replace( 'editor1' );
//----------------------------------------------------------------------
// KW init
//----------------------------------------------------------------------
$(initKW);
//----------------------------------------------------------------------
// Editor key intercept
//----------------------------------------------------------------------
CKEDITOR.instances.editor1.on('contentDom', function() {
CKEDITOR.instances.editor1.document.on('keyup', function(event) { $(initKW); });
});
function removeDiacritics (str) {
var defaultDiacriticsRemovalMap = [
{'base':'A', 'letters':'\u0041\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F'}
];
var diacriticsMap = {};
for (var i=0; i < defaultDiacriticsRemovalMap .length; i++){
var letters = defaultDiacriticsRemovalMap [i].letters;
for (var j=0; j < letters.length ; j++){
diacriticsMap[letters[j]] = defaultDiacriticsRemovalMap [i].base;
}}
return str.replace(/[^\u0000-\u007E]/g, function(a){
return diacriticsMap[a] || a;
});}
function KeyDensityShow(srctext, MaxKeyOut, keylenMin) {
var Output;
// Split text on non word characters
var words = srctext.toLowerCase().split(/\W+/)
var positions = new Array()
var word_counts = new Array()
try {
for (var i=0; i<words.length; i++) {
var word = words[i]
if (!word || word.length < keylenMin) {
continue
}
if (!positions.hasOwnProperty(word)) {
positions[word] = word_counts.length;
word_counts.push([word, 1]);
} else {
word_counts[positions[word]][1]++;
}}
// Put most frequent words at the beginning.
word_counts.sort(function (a, b) {return b[1] - a[1]})
// Return the first MaxKeyOut items
return word_counts.slice(0, MaxKeyOut)
}
catch(err) {
return "";
}}
function removeStopWords(input) {
var stopwords = ['test',
];
var filtered = input.split( /\b/ ).filter( function( v ){
return stopwords.indexOf( v ) == -1;
});
stopwords.forEach(function(item) {
var reg = new RegExp('\\W'+item +'\\W','gmi');
input = input.replace(reg, " ");
});
return input.toString();
}
function initKW() {
$('#KWdensity').html('');
var TextGrab = CKEDITOR.instances['editor1'].getData();
TextGrab = $(TextGrab).text(); // html to text
TextGrab = removeDiacritics(TextGrab);
TextGrab = removeStopWords(TextGrab);
TextGrab = TextGrab.replace(/\r?\n|\r/gm," ").trim(); // remove line breaks
TextGrab = TextGrab.replace(/\s\s+/g, " ").trim(); // remove double spaces
TextGrab = TextGrab.replace(/[^a-zA-Z ]+/g, "").trim(); // only letters and and space
if (TextGrab != "")
{
var keyCSV = KeyDensityShow(TextGrab, 11, 3);
var KeysArr = keyCSV.toString().split(',');
var item, items = '';
for (var i = 0; i < KeysArr.length; i++) {
item = '';
item = item + '<b>' + KeysArr[i] + "</b></button> ";
i++;
item = '<button class="btn btn-default btn-xs" type="button"><span class="badge">' + KeysArr[i] + "</span> " + item;
items = items + item;
}
$('#KWdensity').html(items);
}
}
});
</script>
正如你所看到的,有一个函数可以删除变音符号“defaultDiacriticsRemovalMap”它有一些从A到Z的值,我缩短了它,看看是否Ö显示什么都没有,也没有变音符号。我也试着删除这个代码的许多部分,没有工作。
我不擅长Javascript,但我有一些知识,无论如何,以了解功能,我不能真正看到哪里是这个代码的问题。
有什么想法如何删除变音符号删除功能,并使字符如öäåñ等工作,而不脚本将其自动更改为oaan?
以下是Fiddle演示:
https://jsfiddle.net/rg0myntj/1/
DEMO
1条答案
按热度按时间czfnxgou1#
这一行
TextGrab.replace(/[^a-zA-Z ]+/g, "").trim()
删除了除a到z的大小写和空格之外的所有内容。这意味着unicode字符将被删除。因此,删除或注解掉这一行代码。这一行
srctext.toLowerCase().split(/\W+/)
将被拆分为任何不是a到z或0到9的内容。这意味着单词ahöäåra将是ah和ra。将其替换为
srctext.toLowerCase().split(/[^\p{L}\p{M}\p{N}]+/u)
。要删除函数
removeDiacritics()
,只需在代码中删除它。第一个
由于iframe权限,上面的代码无法在堆栈溢出上正常运行。请在jsFiddle上查看它的运行情况。