正则表达式计算不包括 html 标记的单词

RegEx count words excluding html tags

本文关键字:单词 html 计算 不包括 正则表达式      更新时间:2023-09-26

我有以下情况。

我有一个页面,我们有一个 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 标签之外的所有单词,以便在我们的系统上进行适当的字数统计。

到目前为止我已经尝试过

/['w'u2019''-]+/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(/&nbsp;|&#160;/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.(),;:!?%#$?'x27'x22_+='''/'-]*/g, ''); // remove numbers and punctuation
    
    			var wordArray = tx.match(/['w'u2019'x27'-'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 />"));

计算单词。

我改进了您的正则表达式以检查单词周围的<>/字符。

正则表达式:/[^<>/](['w'u2019''-]+)(?!'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>