将 html 转换为文本表示并保留标签的空白含义 - 如何?

发布于 2025-01-02 07:32:54 字数 594 浏览 0 评论 0原文

考虑这样的 html 片段:

<p>foo</p><p>bar</p>

如果你运行(例如)jQuery text ,你将得到“foobar”——所以它实际上是原始文本,而不是文本表示。

我正在寻找一些准备使用的库来获取文本表示,在本例中它应该是 - “foo\nbar”。或者聪明地提示如何使这尽可能简单;-)。

注意:我不是在寻找漂亮的输出文本,而只是保留空格的含义,因此对于:

<tr><td>foo</td><td>bar</td></tr>
<tr><td>1</td><td>2</td></tr>

我会很高兴

foo bar
1 2

它不一定是:(

foo bar
1   2

但当然没有造成任何伤害)。

Consider such html piece:

<p>foo</p><p>bar</p>

If you run (for example) jQuery text for it you will get "foobar" -- so it is raw text actually, not textual representation.

I am looking for some ready to use library to get textual representation, in this case it should be -- "foo\nbar". Or clever hints how to make this as easy as possible ;-).

NOTE: I am not looking for beautiful output text, but just preserved meaning of whitespaces, so for:

<tr><td>foo</td><td>bar</td></tr>
<tr><td>1</td><td>2</td></tr>

I will be happy with

foo bar
1 2

it does NOT have to be:

foo bar
1   2

(but of course no harm done).

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

失去的东西太少 2025-01-09 07:32:54

您是否看过 innerTexttextContent 特性?

function getText(element){
    var s = "";
    if(element.innerText){
        s = element.innerText;
    }else if(element.textContent){
        s = element.textContent;
    }
    return s;
}

示例

将 PRE 标记添加到正文并附加正文文本。

document.body.appendChild(
    document.createElement('pre')
)
.appendChild(
    document.createTextNode(
        getText(document.body)
    )
);

编辑

使用范围可以在 Firefox 中使用吗?

var r = document.createRange();
r.selectNode(document.body);
console.log(r.toString());

编辑

看来你被这样的解析函数困住了。

var parse = function(element){
    var s = "";
    for(var i = 0; i < element.childNodes.length; i++){
        if(/^(iframe|noscript|script|style)$/i.test(element.childNodes[i].nodeName)){
            continue;
        }else if(/^(tr|br|p|hr)$/i.test(element.childNodes[i].nodeName)){
            s+='\n';
        }else if(/^(td|th)$/.test(element.childNodes[i].nodeName)){
            s+='\t';
        }

        if(element.childNodes[i].nodeType == 3){
            s+=element.childNodes[i].nodeValue.replace(/[\r\n]+/, "");
        }else{
            s+=parse(element.childNodes[i]);
        }
    }
    return s;
}

console.log(parse(document.body)); 

Have you looked at the innerText or textContent properties?

function getText(element){
    var s = "";
    if(element.innerText){
        s = element.innerText;
    }else if(element.textContent){
        s = element.textContent;
    }
    return s;
}

Example

Adds a PRE tag to the body and appends the body text.

document.body.appendChild(
    document.createElement('pre')
)
.appendChild(
    document.createTextNode(
        getText(document.body)
    )
);

Edit

Does using a range work with firefox?

var r = document.createRange();
r.selectNode(document.body);
console.log(r.toString());

Edit

It looks like you're stuck with a parsing function like this then.

var parse = function(element){
    var s = "";
    for(var i = 0; i < element.childNodes.length; i++){
        if(/^(iframe|noscript|script|style)$/i.test(element.childNodes[i].nodeName)){
            continue;
        }else if(/^(tr|br|p|hr)$/i.test(element.childNodes[i].nodeName)){
            s+='\n';
        }else if(/^(td|th)$/.test(element.childNodes[i].nodeName)){
            s+='\t';
        }

        if(element.childNodes[i].nodeType == 3){
            s+=element.childNodes[i].nodeValue.replace(/[\r\n]+/, "");
        }else{
            s+=parse(element.childNodes[i]);
        }
    }
    return s;
}

console.log(parse(document.body)); 
清风挽心 2025-01-09 07:32:54

我可能与 Zapthedingbat 同时开始编写自己的函数,因此仅供记录:

var NodeTypeEnum = { Element    : 1,Attribute   : 2, Text:  3, Comment  :8,Document     :9};

function doTextualRepresentation(elem)
{
    if (elem.nodeType==NodeTypeEnum.Text)
        return elem.nodeValue;
    else if (elem.nodeType==NodeTypeEnum.Element || elem.nodeType==NodeTypeEnum.Document)
    {
        var s = "";

        var child = elem.firstChild;
        while (child!=null)
        {
            s += doTextualRepresentation(child);
            child = child.nextSibling;
        }

        if (['P','DIV','TABLE','TR','BR','HR'].indexOf(elem.tagName)>-1)
            s = "\n"+s+"\n";
        else if (['TD','TR'].indexOf(elem.tagName)>-1)
            s = "\t"+s+"\t";

        return s;

    }

    return "";
}

function TextualRepresentation(elem)
{
    return doTextualRepresentation(elem).replace(/\n[\s]+/g,"\n").replace(/\t{2,}/g,"\t");
}

令我惊讶的一件事 - 我无法开始

for (var child in elem.childNodes)

工作,这很遗憾,因为我大部分时间都花在 C# 上,而且我像这样的语法,理论上它应该在JS中起作用,但事实并非如此。

I started writing my own function probably at the same time as Zapthedingbat, so just for the record:

var NodeTypeEnum = { Element    : 1,Attribute   : 2, Text:  3, Comment  :8,Document     :9};

function doTextualRepresentation(elem)
{
    if (elem.nodeType==NodeTypeEnum.Text)
        return elem.nodeValue;
    else if (elem.nodeType==NodeTypeEnum.Element || elem.nodeType==NodeTypeEnum.Document)
    {
        var s = "";

        var child = elem.firstChild;
        while (child!=null)
        {
            s += doTextualRepresentation(child);
            child = child.nextSibling;
        }

        if (['P','DIV','TABLE','TR','BR','HR'].indexOf(elem.tagName)>-1)
            s = "\n"+s+"\n";
        else if (['TD','TR'].indexOf(elem.tagName)>-1)
            s = "\t"+s+"\t";

        return s;

    }

    return "";
}

function TextualRepresentation(elem)
{
    return doTextualRepresentation(elem).replace(/\n[\s]+/g,"\n").replace(/\t{2,}/g,"\t");
}

One thing I am surprised with -- I couldn't get

for (var child in elem.childNodes)

working, and it is a pity, because I spend most time in C# and I like this syntax, theoretically it should work in JS, but it doesn't.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文