Javascript 获取两个图像之间的文本

Javascript 获取两个图像之间的文本,javascript,html,Javascript,Html,有没有更简单的方法来捕获两个没有相同父元素的图像之间的文本? 我正在为一个网页制作一个用户脚本。 比如: 一些文本 更多文本 如何获取div内容的第一个图像和第二个图像之间的文本。我不知道确切的结构,因为可能文本和图像可能在div或a节点内部。我宁愿不使用图书馆这个答案不是最好的,我只是把它放在这里仅供参考 1-下降 2-转到下一个兄弟姐妹 3-如果没有,就上去找下一个兄弟姐妹 重复一遍 就像穿过这样的山谷:D \ div#content

有没有更简单的方法来捕获两个没有相同父元素的图像之间的文本? 我正在为一个网页制作一个用户脚本。 比如:


一些文本
更多文本

如何获取div内容的第一个图像和第二个图像之间的文本。我不知道确切的结构,因为可能文本和图像可能在div或a节点内部。我宁愿不使用图书馆

这个答案不是最好的,我只是把它放在这里仅供参考

1-下降

2-转到下一个兄弟姐妹

3-如果没有,就上去找下一个兄弟姐妹

重复一遍

就像穿过这样的山谷:D

\                 div#content                     /
 \txt/\  div   /\ div /\    div     /\txt/\  div /
       \  a   /  \txt/  \    a     /       \img2/
        \img1/           \txt/\txt/
好吧,几个小时后我发现了,并做了算法:

function textAfterElem (el, nextEl) {
    var txt = "";

    while(true){
        //go down
        while(el.firstChild) {
            el = el.firstChild;
            if (el == nextEl) {return txt;}
        }
        txt += el.textContent; // extract
        //go next
        if (el.nextSibling) {
            el = el.nextSibling;
            if (el == nextEl) {return txt;}
        }else{
            //go up
            while(!el.nextSibling) {
                el = el.parentNode;
                if (el == document.body) {return txt;} // for security
            }
            if (el.nextSibling) {
                el = el.nextSibling; // go next
                if (el == nextEl) {return txt;}
            }else{
                return txt; // for security
            }
        }
    }
    return txt;
}

它不仅可以用于图像,还可以用于任何元素,您基本上希望将
标记作为要提取文本的引号来处理

最简单的方法是用文本中不太可能重复的内容替换
标记,并使用该字符作为分隔符。我将向您展示如何使用jQuery。如果您需要在纯JS中完成它,那么您必须转换它

首先,制作HTML的副本

var html = $('<div>').append($("#content").html());
要找到所有匹配项,只需重复

while(match != null)
{
    alert(match[1]);
    match = rx.exec(str);    
}
也可以用像
@img@
这样的独特短语来代替单个字符,但单个字符更容易

这是一把小提琴


用纯javascript改进Mathew的答案:

var html = document.getElementById('content').cloneNode(true);
var imgs = html.getElementsByTagName('img');
for (i = 0; i < imgs.length; i++) {
    var textSep = document.createTextNode('@img@');
    imgs[i].parentNode.insertBefore(textSep, imgs[i]);
}
var texts = html.textContent;
texts = texts.split('@img@');
var html=document.getElementById('content').cloneNode(true);
var imgs=html.getElementsByTagName('img');
对于(i=0;i
简单的擦除和拆分也可以:

html.replace(/<(?!img\b)[^>]*>/g, '').split(/<img\b[^>]*>/)

你能提供更多关于条件的细节吗?你可以用一个类名将整个东西包装在一个
div
中,并使用它来获取内部文本。你所寻找的东西是否可能做到这一点?你应该提供更多的案例,以便我们能够看到最适合你的选择。你是否阅读了这里问题的答案“”?我不完全相信它是重复的,但我认为它可能是。那么,这个问题的答案成功地回答了你自己的问题吗?如果不是,考虑一下他们如何去解决你的需求(仅仅因为一个问题是相似的并不意味着它们不能是不同的/不重复的)。尽管你现在有责任清楚地解释你的问题是如何不同的,以及在这种情况下,另一个问题的答案是如何失败的。包括代码、任何错误消息、使用不同/否库……是的,这是一个很好的逻辑,我认为我的循环解决方案风险太大,如果我更好地使用@img@,正则表达式会是什么?因为我认为~号或另一个单号风险太大,但我意识到使用
split(“~”)
而不是regexWell会更好。如果循环失控,这个解决方案有点风险
while(match != null)
{
    alert(match[1]);
    match = rx.exec(str);    
}
var html = document.getElementById('content').cloneNode(true);
var imgs = html.getElementsByTagName('img');
for (i = 0; i < imgs.length; i++) {
    var textSep = document.createTextNode('@img@');
    imgs[i].parentNode.insertBefore(textSep, imgs[i]);
}
var texts = html.textContent;
texts = texts.split('@img@');
html.replace(/<(?!img\b)[^>]*>/g, '').split(/<img\b[^>]*>/)
["↵     ", "↵     some text↵     ", "↵     more text↵"]