我有以下情况。
我有一个页面,我们有一个 tinymce 编辑器,我们可以在其中粘贴文本。有一个选项可以限制要粘贴到编辑器中的字符或单词。
我有这样的文字
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod<br />tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,<br />quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo<br />consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse<br />cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non<br />proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod<br />tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,<br />quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo<br />consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse<br />cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non<br />proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod<br />tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,<br />quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo<br />consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse<br />cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non<br />proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod<br />tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,<br />quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo<br />consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse<br />cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non<br />proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod<br />tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,<br />quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo<br />consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse<br />cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non<br />proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod<br />tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,<br />quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo<br />consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse<br />cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non<br />proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p><p>
根据SublimeText,它有342个单词长。
如果我删除html标签,Sublime说它是368个单词长,MS Word是379个单词。
我正在尝试找到一个正则表达式,它可以查找除 html 标签之外的所有单词,以便在我们的系统上进行适当的字数统计。
到目前为止我已经尝试过
/[wu2019'-]+/gim
但这包括 HTML 标记中的字符,如下所示
正则表达式101
我也尝试过
(s+|>)w+
这越来越近了,但这还包括作为 html 实体一部分的>符号,如下所示
正则表达式101
请记住,我不能替换尖括号内的文本,因为此文本编辑器用于科学和医学论文提交,因此在某些情况下,这些符号<和>用于符号。和>
TinyMCE的插件实际上存在,它计算给定文本的单词。
这是tinymce/js/tinymce/plugins/wordcount/的稍微改编的版本 这应该符合您的目的。
toPlainText = function(string) {
var tx = string;
var tc = 0;
if (tx) {
tx = tx.replace(/.../g, ' '); // convert ellipses to spaces
tx = tx.replace(/<.[^<>]*?>/g, ' ').replace(/ | /gi, ' '); // remove html tags and space chars
// deal with html entities
tx = tx.replace(/(w+)(&#?[a-z0-9]+;)+(w+)/i, "$1$3").replace(/&.+?;/g, ' ');
tx = tx.replace( /[0-9.(),;:!?%#$?x27x22_+=\/-]*/g, ''); // remove numbers and punctuation
var wordArray = tx.match(/[wu2019x27-u00C0-u1FFF]+/g);
if (wordArray) {
tc = wordArray.join(" ");
}
}
var div = document.createElement('div');
div.innerHTML = tc;
return div.textContent;
}
document.write(toPlainText("<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod<br />tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,<br />quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo<br />consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse<br />cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non<br />"));
计算单词。
我改进了您的正则表达式以检查单词周围的<>/
字符。
正则表达式:/[^<>/]([wu2019'-]+)(?!s*/>)/gmi
正则表达式 101 演示
我会通过将其分解为:
var text = "<p>Lorem ipsum</p><p>Lorem ipsum</p><p sdf>Lorem ipsum</p>";
var words = text.replace(/(<([^s>]+)>)/ig, " ").trim().split(/s+/).length;
console.log(words); // output: 6
- 首先使用带有正则表达式的
replace
删除所有 HTML 标记 - 使用
trim
- 然后使用正则表达式
split
所有单词(这样空格就不算作单词)
最后你有字数。
请注意,我使用以下正则表达式来替换/(<([^s>]+)>)/ig
:
- 像
<p>
、</p>
等标签被替换,而- 不会替换类似(包括空格)之类的标记。
这应该给你一个很好的近似值。
<div id="test">
<p>foofoofoofoofoo</p>
<h1>googoogoogoogoogoo</h1>
<script>
var allText;
var divElm = document.getElementById('test');
for (text in divElm.childNodes) {
allText += divElm.childNodes[text].textContent;
}
alert(allText);
</script>