0

内部にリンクを保持したまま、html ドキュメントからテキストを抽出したいと考えています。例えば:

この HTML コードから

<div class="CssClass21">bla1 bla1 bla1 <a href="http://www.ibrii.com">go to ibrii</a> bla2 bla2 bla2 <img src="http://www.contoso.com/hello.jpg"> <span class="cssClass34">hello hello</span>

これだけ抽出したい

bla1 bla1 bla1 <a href="http://www.ibrii.com">go to ibrii</a> bla2 bla2 bla2 hello hello

<[^>]*>StackOverflow の別の投稿で、すべての一致を何も置き換えずにテキストを抽出できるRegEx を見つけました。一致からアンカー タグを除外するにはどうすればよいですか? RegEx では逆一致が許可されていないようです。

4

2 に答える 2

2

正規表現は、先読みによる自明でない形式の否定を可能にしますが、この場合は演習としてはちょうどいいでしょう。なぜなら、正規表現が HTML と一緒に言及されるたびに聖火で燃える狂信者ではないからです。パーサーで解決する問題。

于 2010-01-02T11:45:45.103 に答える
0

<a href ...>...</a>一時的に他の何かにエンコードし、他のすべてのタグを削除してから、タグを復元し<a>ます。

// Example in javascript:
string.
    replace(/<a(.*?)>/g,'\0$1\0').
    replace(/<\/a>/,'\1').
    replace(/<[^>]*>/,'').
    replace(/\0(.*?)\0/,'<a$1>').
    replace(/\1/,'</a>');

<a>上記のコードでは、文字列に表示される可能性が非常に低いという理由だけで、タグの代わりにNUL文字とSOH文字(ASCII 0x00および0x01)を使用しています。文字列に表示されない他の文字または文字のシーケンスに自由に置き換えてください。

追加のコメントから、ブラウザで操作しているように見えます。この場合、ブラウザはすでにHTMLを解析して素敵なDOMツリーにしています。DOMメソッドを使用してツリーを解析し、必要な方法で処理します。

function simpleHTML (domNode) {
    var ret = "";
    if (domNode.nodeType === Node.ELEMENT_NODE) {
        var children = domNode.childNodes;
        for (var i=0;i<children.length;i++) {
            var child = children[i];

            // Filter out unwanted nodes to speed up processing.
            // For example, you can ignore 'SCRIPT' nodes etc.
            if (child.nodeName != 'SCRIPT') {
                if (child.nodeName == 'A') {
                    ret += '<a href="' + child.href + '">' +
                               simpleHTML(child) +
                           '</a>';
                }
                else {
                    ret += simpleHTML(child);
                }
            }
        }
    }
    else if (domNode.nodeType === Node.TEXT_NODE) {
        ret +=  domNode.nodeValue;
    }
    return ret;
}
// serialize the whole document:
var simpleDocument = simpleHTML(document.body);

// serialize a div:
var simpleDiv = simpleHTML(document.getElementById('some_div'));

// filter a html formatted string:
var temp = document.createElement('DIV');
temp.innerHTML = original_string;
simple_string = simpleHTML(temp);
于 2010-01-02T11:44:56.930 に答える