Regex - hogyan lehet megtalálni egy szót nem zárt html tag vagy a köztük

szavazat
1

Szeretnék találni egy meccset egy html karakterláncot.

Ez nem lesz között html tag vagy bennük.

Például:

a szó: ue

<span color=blue>ue</span>ue<span>sdfsd</span>

ezért szeretnék találni csak a harmadik mérkőzés le (nem a „kék”), és nem a spancímkéket.

Kösz

A kérdést 12/06/2011 14:17
a forrás felhasználó
Más nyelveken...                            


4 válasz

szavazat
2

HTML nem egy reguláris nyelv , így nem értelmezhető a reguláris kifejezések .

Válaszolt 12/06/2011 14:22
a forrás felhasználó

szavazat
2

Ahogy kiváló DOM manipuláció lehetőség a böngészőt, akkor igénybe vehetik ezt. Létre kell hozni egy új elemet, állítsa be a string tartalmát és végighaladni az összes szöveges csomópontok:

var tmp = document.createElement('div');
tmp.innerHTML = htmlString;

var matches = [],
    children = tmp.childNodes,
    node,
    word = ' ' + word + ' ';

for(var i = children.length; i--; ) {
    node = children[i];
    if(node.nodeType === 3 && (' ' + node.nodeValue + ' ').indexOf(word) > -1) {
        matches.push(node);
    }
}
Válaszolt 12/06/2011 14:22
a forrás felhasználó

szavazat
4

Megpróbálod reguláris kifejezések használatával elemezni HTML. HTML nem lehet könnyen, megbízhatóan feldolgozni egy reguláris kifejezés önmagában.

Ha ezt a böngésző, akkor ehelyett kihasználja a böngésző magasan optimalizált HTML értelmező.

Ha azt szeretnénk, hogy észleli a szót, ha egy tag-között (például „u <hr> e”):

var element, node, topLevelText;
element = document.createElement('div');
element.innerHTML = "<span color=blue>ue</span>ue<span>sdfsd</span>";
topLevelText = "";
for (node = element.firstChild; node; node = node.nextSibling) {
    if (node.nodeType === 3) { // 3 = text node
        topLevelText += node.nodeValue;
    }
}
if (topLevelText.indexOf(word) >= 0) {
    // Found
}

Ha csak szeretné érzékelni azt a dolgok között (így például az, de nem „u <hr> e”):

var element, node;
element = document.createElement('div');
element.innerHTML = "<span color=blue>ue</span>ue<span>sdfsd</span>";
for (node = element.firstChild; node; node = node.nextSibling) {
    if (node.nodeType === 3) { // 3 = text node
        if (node.nodeValue.indexOf(word) >= 0) {
            // Found
        }
    }
}

(E két do-és nagybetűk megfelelő.)

Hogy működik ez

  1. Létrehoz egy elem, amely nem jelenik meg sehol a document.createElement.
  2. Elemzi a szöveget HTML hozzárendelésével innerHTMLaz elemre. Ez a tulajdonság csak nemrégiben szabványosított, de ez már támogatja az összes jelentős böngészők egy évtized múlva.
  3. Úgy néz ki, a közvetlen leszármazottja a csomópont, amely magában foglal minden olyan elemet készítette elemzést, illetve szöveges csomópontok a legfelső szintű szöveget a string (pl szöveget a hely, ahol keresni szeretne neki). Ezt használja Node#firstChild, Node#nodeType, Node#nodeValueés Node#nextSibling.
  4. Attól függően, hogy szeretné megtalálni azt a „u <hr> e” helyzet, akkor sem néz ki, közvetlenül a szövegben az egyes szöveges csomópontok, vagy épít mindet fel egy string és kereséseket, utána.

A fenti hivatkozások többnyire a DOM2 Core spec , amelyek többsége támogatja a legtöbb böngésző. Más hivatkozások, hogy hasznos lehet:

Válaszolt 12/06/2011 14:24
a forrás felhasználó

szavazat
3

Feltételezve, hogy van dolga egy töredéke HTML (és nem a teljes dokumentum), akkor írj egy reguláris kifejezés, hogy megfeleljen a legtöbb jól formált legbelső, nem beágyazott elemeket, majd ezt regex rekurzív távolítsa el az összes címkézett anyagokat, így a kívánt nem-jelölt anyag maradt a címkék között. Itt csak olyan regex (kommentárok PHP / PCRE „x” szintaxis), amely megfelel a legtöbb üres, nem üres, nem beágyazott, nem shorttag HTML-elemeket.

$re_html = '%# Match non-nested, non-shorttag HTML empty and non-empty elements.
    <                    # Opening tag opening "<" delimiter.
    (\w+)\b              # $1: Tag name.
    (?:                  # Non-capture group for optional attribute(s).
      \s+                # Attributes must be separated by whitespace.
      [\w\-.:]+          # Attribute name is required for attr=value pair.
      (?:                # Non-capture group for optional attribute value.
        \s*=\s*          # Name and value separated by "=" and optional ws.
        (?:              # Non-capture group for attrib value alternatives.
          "[^"]*"        # Double quoted string.
        | \'[^\']*\'     # Single quoted string.
        | [\w\-.:]+\b    # Non-quoted attrib value can be A-Z0-9-._:
        )                # End of attribute value alternatives.
      )?                 # Attribute value is optional.
    )*                   # Allow zero or more attribute=value pairs
    \s*                  # Whitespace is allowed before closing delimiter.
    (?:                  # This element is either empty or has close tag.
      />                 # Is either an empty tag having no contents,
    | >                  # or has both opening and closing tags.
      (                  # $2: Tag contents.
        [^<]*            # Everything up to next tag. (normal*)
        (?:              # We found a tag (open or close).
          (?!</?\1\b) <  # Not us? Match the "<". (special)
          [^<]*          # More of everything up to next tag. (normal*)
        )*               # Unroll-the-loop. (special normal*)*
      )                  # End $2. Tag contents.
      </\1\s*>           # Closing tag.
    )
    %x';

Íme ugyanaz regex Javascript szintaxisa:

var re_html = /<(\w+)\b(?:\s+[\w\-.:]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[\w\-.:]+\b))?)*\s*(?:\/>|>([^<]*(?:(?!<\/?\1\b)<[^<]*)*)<\/\1\s*>)/;

Az alábbi javascript függvény csíkok HTML elemeket, így a kívánt címkék közötti szöveget:

// Strip HTML elements.
function strip_html_elements(text) {
    // Match non-nested, non-shorttag HTML empty and non-empty elements.
    var re = /<(\w+)\b(?:\s+[\w\-.:]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[\w\-.:]+\b))?)*\s*(?:\/>|>([^<]*(?:(?!<\/?\1\b)<[^<]*)*)<\/\1\s*>)/g;
    // Loop removing innermost HTML elements from inside out.
    while (text.search(re) !== -1) {
        text = text.replace(re, '');
    }
    return text;
}

Ez regex megoldás nem megfelelő elemzőt, és fogantyúk csak egyszerű HTML töredékek, amelyek csak html elemeket. Nem (és nem) megfelelő feldolgozásához bonyolultabb jelölést, amely olyan dolgok, mint a megjegyzéseket, CDATA szakaszok, és doctype nyilatkozatokat. Ez nem távolítja elem hiányzik a kötelező záró tag (azaz <p>és <li>elemek.)

Válaszolt 12/06/2011 16:14
a forrás felhasználó

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more