2011-01-25 11 views
5

Poszukuję strony, aby znaleźć określone słowo kluczowe. To samo w sobie jest łatwe. Dodatkową komplikacją jest to, że nie chcę dopasowywać tego słowa kluczowego, jeśli jest ono częścią tagu <a>.Jak dopasować słowo kluczowe na stronie internetowej, które NIE jest w zakresie <a> i jego href, używając JavaScript?

E.g.

<p>Here is some example content that has a keyword in it. 
I want to match this keyword here but, i don't want to match 
the <a href="http://www.keyword.com">keyword</a> here.</p> 

Jeśli spojrzysz na powyższą przykładową treść, słowo "słowo kluczowe" pojawi się 4 razy. Chcę dopasować pierwsze dwukrotne wyświetlenie akapitu, ale nie chcę go dopasowywać, gdy pojawia się jako część href i jako część treści <a>.

Do tej pory udało mi się użyć tego poniżej:

var tester = new RegExp("((?!<a.*?>)("+keyword+")(?!</a>))", 'ig'); 

Problem z tym powyżej jest to, że nadal pasuje do słowa kluczowego, jeśli jest częścią href.

Wszelkie pomysły? Dzięki

+1

Używasz JavaScript? – Gumbo

+0

Wygląda jak na podstawie jego kodu przykładowego. –

+0

Co jeśli jest w atrybucie innego znacznika, np. ''? Lub w komentarzu, sekcji CDATA lub instrukcji przetwarzania? Co jeśli jest częścią skryptu lub arkusza stylów? –

Odpowiedz

5

Nie można wiarygodnie zrobić tego za pomocą wyrażeń regularnych JavaScript. Jest dość trudny w działaniu z silnikiem regex .NET, który jest jednym z niewielu, który obsługuje nieskończoną liczbę twierdzeń lookbehind, ale JavaScript nie zna w ogóle twierdzeń lookbehind, więc nie można spojrzeć wstecz, aby zobaczyć, co było przed tekstem chcesz dopasować.

Powinieneś więc użyć parsera DOM (jestem pewien, że ktoś biegły w JavaScript może zasugerować praktyczne podejście tutaj), lub przeczytać tekst, usunąć wszystkie znaczniki <a> (co możesz zrobić z regexem, jeśli jesteś odważnym typem), a następnie wyszukaj słowo kluczowe w pozostałej części tekstu.

EDIT:

Cóż, nie jest zabrudzony hack, które mógł wykorzystanie. To nie jest ładna, a jeśli spojrzeć na komentarzu Alana Moore'a na pytanie, będziesz w stanie sobie wyobrazić wiele sposobów, w którym ten regex nie uda, ale to nie działa na przykład:

/keyword(?!(?:(?!<a).)*</a)/ 

Jak Czy to działa"?

keyword # Match "keyword" 
(?!  # but only if it is not possible to match the following regex in the text ahead: 
(?:  # - Match... 
    (?!<a) # -- unless it's the start of an <a> tag... 
    .  # -- any character 
)*  # - any number of times 
</a>  # then match a closing <a> tag. 
)   # End of lookahead assertion. 

Jest to dość zagadkowe, nawet z wyjaśnieniem. Co ona zasadniczo robi jest:

  • Mecz „słowo kluczowe”
  • Patrzeć w przyszłość, że nie ma zamykania </a> w poniższym tekście
  • chyba znacznik otwarcie <a> nastąpi wcześniej.

Więc jeśli wszystkie <a> tagi są prawidłowo wyważony, nie zagnieżdżone, nie znaleziono wewnątrz komentarzy lub bloków skryptowych, może po prostu uciec z nim.

Powiązane problemy