Autor Zpráva
PavV
Profil
Ahojky

mám tento kod
      var regex = new RegExp( '('+ $('#search-box').val() +')', 'ig');
      $('#text-frame').contents().find('.phr').each(function() {
        $(this).html( $(this).html().replace( regex, '<mark data-id=0>$1</mark>'));
      })

v tagu je vložen další tag. Jak docílit aby označil jen text a znaků mezi <...> si nevšímal ?

Např. hledám s
Seda si <span class='sa'>sám</span>

Výsledek:
<mark data-id=0>S</mark>eda <mark data-id=1>s</mark>i <span class='sa'><mark data-id=2>s</mark>ám</span>

Dík předem za radu
PS: pokud se data-id nebudou číslovat nevadí
Serg
Profil
Zkus tohle:
 var src_str = $("#test").text();
var term = "my text";
term = term.replace(/(\s+)/,"(<[^>]+>)*$1(<[^>]+>)*");
var pattern = new RegExp("("+term+")", "gi");

src_str = src_str.replace(pattern, "<mark>$1</mark>");
src_str = src_str.replace(/(<mark>[^<>]*)((<[^>]+>)+)([^<>]*<\/mark>)/,"$1</mark>$2<mark>$4");

$("#test").html(src_str);

zdroj: https://stackoverflow.com/a/19721054

Ten regulár mi příjde celkem složitější než by musel být (asi řeší spoustu dalších situací nebo co..), ale vypadá to, že funguje :D
PavV
Profil
Serg:
díky, ale není to to pravé. Už první příkaz je vadný. Musí se do proměnné načíst celé html, nikoliv jen text. Tedy $('#test').html(). Zkusil jsem obě možnosti a výsledek je stejný co původní
Výsledek Vašeho kodu při $('#test').html():
Z původního texu
Růžový slon v domě a jiné logičnosti<span class="subtitle"><br>&nbsp;aneb&nbsp;<br>Úvod do tajů výrokové logiky se zvláštním přihlédnutím k logickým hádankám a rébusům</span>

to udělalo
Růžový <mark>s</mark>lon v domě a jiné logično<mark>s</mark>ti&lt;<mark>s</mark>pan cla<mark>s</mark><mark><mark>s</mark>="<mark>s</mark>ubtitle"&gt;<br>&amp;nb<mark>s</mark>p;aneb&amp;nb<mark>s</mark>p;<br>Úvod do
                tajů výrokové logiky <mark>s</mark>e zvláštním přihlédnutím k logickým hádankám a rébu<mark>s</mark>ům<!--<mark-->s</mark>pan&gt;
Serg
Profil
Aha, toho .text() jsem si nevšiml. Koukal jsem na živou ukázku (jsfiddle.net/UPs3V/291) a tam měl .html(), a v ukázce byl právě odkaz, který to po označení přežil a zůstal si dál být funkčním odkazem.

Co myslíš tím, že výsledek je stejný co původní? Jako že to po transformaci rozbije html prvky?
V komentech u toho psali, že to zruší navázané eventy (přes addEventListener), ale o eventy se příjdeme tak jako tak, když se změní innerHTML

Tohle vypadá taky zajímavě: jsfiddle.net/crustyashish/rGrvf/1
Akorát tam nepracuje se stringem a .replace() ale s DOM-em

PavV:
<mark>S</mark>eda <mark>s</mark>i <<mark>s</mark>pan clas<mark>s</mark>='<mark>s</mark>a'><mark>s</mark>ám</span>
Edit: A jo, už to taky vidím. Takže Ctrl+C a Ctrl+V random kódu z netu tady očividně stačit nebude :D
Možná zkusit tu verzi co pracuje přímo s DOM-em, nebo až budu doma tak zkusím popřemýšlet jak upravit regulár aby kontroloval jestli není uvnitř html značky

Co zkusit negative lookbehind? Akorát nevím jestli to JS podporuje.
var regex = new RegExp( '((?<!<[^>]*)'+ $('#search-box').val() +')', 'ig');
Firibix
Profil
Nepokoušejte se parsovat HTML pomocí regulárních výrazů, nikdy to nebude fungovat na 100 %. Druhá odkázaná ukázka v [#4] s využitím DOM API a rekurzivním zanořováním až úroveň textových nodů je správná cesta.
PavV
Profil
PavV, Firibix:
SUPER díky moc

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0