好的,我正在尝试找到一个dom模式:
<div>
<br>
</div>
来自我的contenteditable div
,通常看起来像这样,有多个spans
:
<div id="edit" contenteditable="true">
<span>text</span>
<span>text</span>
//and more spans maybe
<div>
<br>
</div>
</div>
我正在使用的代码行是:
return string.split(/\r\n?|\n|<div>(.*?)<br>(.*?)<\/div>,gis/);
问题在于正则表达式<div>(.*?)<br>(.*?)<\/div>,gis
的这一部分..它永远不会匹配,即使模式存在。为了清楚起见,return
在输入文本的循环中运行,由我contenteditable div
上的输入更改事件触发。我需要在模式所在的每个位置分隔的文本的数组版本。请不要这个库。
答案 0 :(得分:1)
这是一个不涉及任何外部库并且易于理解的解决方案。
首先,让我们抓住edit
div的内容
var $edit = document.getElementById("edit")
现在,我们创建一个小函数来迭代我们的DOM。有很多方法可以做到这一点,道格拉斯·克罗克福德在他的书“JavaScript:The Good Parts”中做到了这一点:i / c>
function walkTheDOM(node, func) {
func(node);
node = node.firstChild;
while (node) {
walkTheDOM(node, func);
node = node.nextSibling;
}
}
此函数遍历node
dom中的每个元素,并在其上运行func
。
唯一剩下的就是从之前的$edit
div调用它。
walkTheDOM($edit, function (node) {
if (node.nodeName.toLowerCase()==="div") { // we got a div
if(node.innerHTML.trim() === "<br>"){ //whose inner html is <br>
console.log("GOT",node);//print its name
}
}
});
在完成找到它的所有工作后,您可以轻松地从其余数据中提取您想要的任何文本/数据。 See this question关于为什么用正则表达式解析HTML通常是一个坏主意。
答案 1 :(得分:0)
旗帜应该出去:
return string.split(/\r\n?|\n|<div>(.*?)<br>(.*?)<\/div>/gis);
我对正则表达式不是很好,但对我来说这似乎也太贪婪了。我相信它会匹配任何包含br的div,而不仅仅是那些只包含br的div。如果它们是嵌套的,它应该与最外面的一个匹配。我按照评论中的建议,通过遍历DOM来解决这个问题。
答案 2 :(得分:0)
我发现了一些潜在的问题:(1)您希望您的旗帜(gis
)超出//
标记。 (2)您首次使用|
需要使用括号来匹配\r
,\n
或\r\n
。你可能根本不需要这些。 (3)我不确定你为什么在这里有替补:\n|<div>
。 (4)s
不是我所知道的旗帜。
这应该可以解决问题:
/<div>(.*?)<br>(.*?)<\/div>/gi
答案 3 :(得分:0)
1)Regexp标志应该在关闭“/”
之后2)使用[\ S \ s] *而不是。*
3)“&lt; text”是错误的html代码,因为“&lt;”应替换为“&amp; lt;”