2

わかりました。RegEx 内での HTML の照合と解析に関して多くの論争があることは承知していますが、何か助けが得られるかどうか疑問に思っていました。ケースとポイント。

たとえば、任意の句読点文字に一致させる必要があり. , " 'ますが、HTML を台無しにしたくないので、理想的には a>と a の間で発生する必要があり<ます。基本的に、クエリは HTML の解析ではなく、それを回避します。

各インスタンスをラップに置き換えようとしていますが<span></span>、正規表現の経験がまったくないため、それができるかどうかわかりません。

文字セットを計算しまし[\.\,\'\"\?\!]たが、特定の文字間でのみ発生する文字セットを一致させる方法がわかりません。誰でも助けることができますか?

4

3 に答える 3

2

まず、X ブラウザーの dom-parser 関数を次に示します。

var parseXML = (function(w,undefined)
{
    'use strict';
    var parser,ie = false;
    switch (true)
    {
        case w.DOMParser !== undefined:
            parser = new w.DOMParser();
        break;
        case new w.ActiveXObject("Microsoft.XMLDOM") !== undefined:
            parser = new w.ActiveXObject("Microsoft.XMLDOM");
            parser.async = false;
            ie = true;
        break;
        default :
            throw new Error('No parser found');
    }
    return function(xmlString)
    {
        if (ie === true)
        {//return DOM
            parser.loadXML(xmlString);
            return parser;
        }
        return parser.parseFromString(xmlString,'text/xml');
    };
})(this);
//usage:    
var newDom = parseXML(yourString);
var allTags = newDom.getElementsByTagName('*');
for(var i=0;i<allTags.length;i++)
{
    if (allTags[i].tagName.toLowerCase() === 'span')
    {//if all you want to work with are the spans:
        if (allTags[i].hasChildNodes())
        {
            //this span has nodes inside, don't apply regex:
            continue;            
        }         
        allTags[i].innerHTML = allTags[i].innerHTML.replace(/[.,?!'"]+/g,'');
    }
}

これは途中で役立つはずです。DOM には引き続きアクセスできるため、フィルタリング/置換が必要な文字列が見つかった場合はいつでも、使用してノードを参照しallTags[i]、コンテンツを置換できます。すべての
要素をループすることはお勧めできませんが、私はあなたのためにすべての作業を行う気がしませんでした;-)。処理しているノードの種類を確認する必要があります。

if (allTags[i].tagName.toLowerCase() === 'span')
{//do certain things
}
if (allTags[i].tagName.toLowerCase() === 'html')
{//skip
    continue;
}    

そして、そのようなもの...
このコードはテストされていませんが、以前の質問に対する私の回答の簡略化されたバージョンであることに注意してください。パーサービットは問題なく動作するはずです。実際、他の質問のために設定したフィドルを次に示します。このコードは、ニーズに合わせてこのコードを変更する方法も示しています

于 2012-11-23T17:15:15.707 に答える
1

編集Elias が指摘したように、ネイティブ JScript は先読みをサポートしていません。他の誰かが同様のものを探している場合に備えて、これを残しておきます。

これが私が仕事をするようになった正規表現です。先読みと後読みが必要で、Javascriptに精通していないため、それらがサポートされているかどうかを知ることができません。いずれにせよ、正規表現は次のとおりです。

(?<=>.*?)[,."'](?=.*<)

壊す:

1. (?<=>.*?)  -->  The match(es) must have ">" followed by any characters
2. [,."']     -->  Matches for the characters:  ,  .  "  '
3. (?=.*<)    -->  The match(es) must have any characters then "<" before it

これは基本的に、一連の> <.

そうは言っても、ポイントがコメントで言及したように、そのために設計されたツールで HTML を解析し、結果を regex で検索することをお勧めします[,."']

于 2012-11-23T17:11:31.207 に答える