Javascript 句子大小写忽略其中html元素的一段文本

Javascript 句子大小写忽略其中html元素的一段文本,javascript,regex,Javascript,Regex,目前,我正在向以下函数传递一段文本,以确保每个句子的第一个字母大写 function sentenceCase(string) { var n = string.split("."); var vfinal = "" for (i = 0; i < n.length; i++) { var spaceput = "" var spaceCount = n[i].replace(/^(\s*).*$/, "$1").length;

目前,我正在向以下函数传递一段文本,以确保每个句子的第一个字母大写

function sentenceCase(string) {
    var n = string.split(".");
    var vfinal = ""
    for (i = 0; i < n.length; i++) {
        var spaceput = ""
        var spaceCount = n[i].replace(/^(\s*).*$/, "$1").length;
        n[i] = n[i].replace(/^\s+/, "");
        var newstring = n[i].charAt(n[i]).toUpperCase() + n[i].slice(1);
        for (j = 0; j < spaceCount; j++) spaceput = spaceput + " ";
        vfinal = vfinal + spaceput + newstring + ".";
    }
    vfinal = vfinal.substring(0, vfinal.length - 1);
    return vfinal;
}
但是,如果文本包含一个
元素,该元素包含句子中的第一个单词,那么它显然会导致问题,如图所示

var str2 = '<span class="pronoun subjective">he</span> always has a positive contribution to make to the class. in class, <span class="pronoun subjective">he</span> behaves well, but <span class="pronoun subjective">he</span> should aim to complete <span class="pronoun possessive">his</span> homework a little more regularly.'; 
console.log(sentenceCase(str2));

Returns >>> <span class="pronoun subjective">he</span> always has a positive contribution to make to the class. In class, <span class="pronoun subjective">he</span> behaves well, but <span class="pronoun subjective">he</span> should aim to complete <span class="pronoun possessive">his</span> homework a little more regularly.
var str2=”他对班级总是有积极的贡献。在课堂上,他表现得很好,但他的目标应该是更有规律地完成作业。”;
console.log(sentenceCase(str2));
返回>>>他对班级总是有积极的贡献。在课堂上,他表现得很好,但他的目标应该是更有规律地完成作业。
我的正则表达式技能远不是一流的,因此我不确定如何从这里开始,因此,如果您建议在将文本转换为句子大小写时如何忽略文本中的任何元素,我将不胜感激


编辑:为了澄清-输出仍然应该保留元素-在考虑上半身的句子时,只需要忽略它们

这不是一个小问题。纯粹使用regexp是因为您可能会遇到棘手的问题,并把事情搞得一团糟——JS regexp的功能根本不足以处理完整的HTML语法

然而,浏览器已经有了处理HTML的方法

var str2=”他对班级总是有积极的贡献。在课堂上,他表现得很好,但他的目标应该是更有规律地完成作业。”;
函数大写(html){
//HTML DOM解析器:参与!
var div=document.createElement('div');
div.innerHTML=html;
//假设字符串的开头也是句子的开头
var边界=真;
//检查每个文本节点
var walker=document.createTreeWalker(div,NodeFilter.SHOW_TEXT,null,true);
while(walker.nextNode()){
var节点=walker.currentNode;
var text=node.textContent;
//如果我们在句子之间,请大写第一个字母
if(边界){
text=text.替换(/[a-z]/,函数(字母){
回信.toUpperCase();
});
}
//大写任何内部标点符号
text=text.replace(/([.?!]\s+)([a-z])/g,函数(u,点,字母){
返回punct+letter.toUpperCase();
});
//如果当前节点以标点符号结尾,则返回句子边界
边界=文本。匹配(/[.?!]\s*$/);
//更改当前节点的文本
node.textContent=文本;
}
返回div.innerHTML;
}

控制台日志(大写(str2))另一种方法-如果拆分以
开头,则将其替换为大写字母。即使有多个标记,这也可以工作

var string='他总是对班级做出积极的贡献。在课堂上,他表现得很好,但他应该努力完成。他的家庭作业更有规律一些;
var n=字符串。拆分(“.”);
var vfinal=“”
对于(i=0;i如果(n[i].trim().charAt(0)='您的输出应该包含HTML元素,或者应该将其删除,就像您正在寻找他……或者只是他………您可以在将字符串传递给函数之前对其进行清理:
string=string.replace(//g',)
这将删除HTML标记。抱歉-澄清一下-输出仍应保留元素-在考虑大写语句时只需忽略它们。regex不是用于此的合适工具。@Ouroburus:可以肯定,regexp仍然是用于此部分的极好工具。不适用于
这不起作用。
。获取将regexp正确地执行此操作是非常重要的。公平调用。更新以允许关闭
“>
这可能不是一个理想的解决方案,但如果输入是一致的和可预测的,则可能可以使用更简单的方法。
var str2 = '<span class="pronoun subjective">he</span> always has a positive contribution to make to the class. in class, <span class="pronoun subjective">he</span> behaves well, but <span class="pronoun subjective">he</span> should aim to complete <span class="pronoun possessive">his</span> homework a little more regularly.'; 
console.log(sentenceCase(str2));

Returns >>> <span class="pronoun subjective">he</span> always has a positive contribution to make to the class. In class, <span class="pronoun subjective">he</span> behaves well, but <span class="pronoun subjective">he</span> should aim to complete <span class="pronoun possessive">his</span> homework a little more regularly.