正则,如何判断字符串内只存在指定字符?

我的使用场景:
需要判断富文本编辑器内是否只输入了空格or回车(这种情况我会判定为空)

let txt = '&nbsp; &nbsp;&nbsp;<br /><br /><br /><br />&nbsp; &nbsp; &nbsp;<br /><br /><br /><br />&nbsp; &nbsp;&nbsp;<br /><br />&nbsp; &nbsp; &nbsp;&nbsp;'

比如上面这串就是只输入了空格和回车后,富本文返回的内容,用正则要如何判断呢?

以及还有一个拓展需求,就是我想要去除富文本编辑器内,内容首尾的空格和回车要如何匹配呢?
感觉这个应该和上面思路有共同的地方

阅读 3.6k
6 个回答
function isEmptyRichText(str) {
    let count = 0;
    for (const x of str.matchAll(/(?:&nbsp;)|(?:<br[ ]*\/>)|(?:[ ]+)/g)) {
        const [match] = x
        const { index } = x;

        if (count === index) {
            count += match.length;
        } else {
            return false
        }
    }
    return true
}

正则匹配空格or回车,然后判断匹配内容是否连续,不连续就证明不全是空格和回车。


首部匹配:

/^((&nbsp;)|(<br[ ]*\/>)|([ ]+))+/

尾部匹配:

/((&nbsp;)|(<br[ ]*\/>)|([ ]+))+$/

我傻了,限定开头和结尾直接 test 就好了。

/^((&nbsp;)|(<br[ ]*\/>)|([ ]+))*$/
/^\s*((&nbsp;|<br\s*\/?>)\s*)*$/.test(txt)

用字符串的方法 replace 或者 replaceAll,把所有空格和回车替换成空,判断剩余字符串长度是否为0即可

if(txt.replaceAll("&nbsp;",'').replaceAll("<br />",'').trim()){
    console.log("输入内容有效")
}

如果字段固定是 和
上面这样判断是否为空 是否可行?

或者 下面这样

var div = document.createElement("div");
div.innerHTML = txt;
if(!div.innerText.trim()){
console.log("未输入有效内容")
}
function checkIsEmpty(html) {
    const div = document.createElement('div');
    div.innerHTML = html;
    if (/^\s+$/m.test(div.innerText)) {
        return true;
    }
    return false;
}

// 调用
checkIsEmpty('&nbsp; &nbsp;&nbsp;<br /><br /><br /><br />&nbsp; &nbsp; &nbsp;<br /><br /><br /><br />&nbsp; &nbsp;&nbsp;<br /><br />&nbsp; &nbsp; &nbsp;&nbsp;'); // true
checkIsEmpty('&nbsp; &nbsp;&nbsp;xx<br /><br /><br /><br />&nbsp; &nbsp; &nbsp;<br /><br /><br /><br />&nbsp; &nbsp;&nbsp;<br /><br />&nbsp; &nbsp; &nbsp;&nbsp;'); // false

有个不用正则来判断字符串是否都是空白或换行符的方法,就是把字符串放入一个空div节点中渲染,再判断它的子节点是否都是br节点或空白文本节点:

function isEmptyText(text) {
    var div = document.createElement("div");
    div.innerHTML = text;
    var nodes = div.childNodes;
    for (var i = 0; i < nodes.length; ++i) {
        var node = nodes[i];
        var name = node.nodeName;
        var value = node.nodeValue && node.nodeValue.trim();
        if (value || name !== "#text" && name !== "BR") return false;
    }
    return true;
}
console.log(isEmptyText(txt));
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题