Javascript Text durchsuchen nach 2 Wörtern?


15.03.2021, 02:41

eigtl soll das Skript auf einer Seite nach bestimmten Wörtern suchen und wenn es eines dieser Wörter findet melden..

Mein Problem ist quasi, das ich keine Ahnung habe, wie ich wirklich deklarieren kann, dass er nur meldet, wenn exakt diese Wörter auftauchen..

// ==/UserScript==

/*globals $*/

let refresh_rate = 50000, //Refresh rate when any searched item isn't found

  timeout = 18000, //If an error occurs, the page will be guaranteed to be refreshed within this time.

  words = [

  "markus,

  "gerhard",

  "berghütte Zillertal",

 "Privat\\s+.*Berchtesgaden",

  "Hotel\\s+.*suite"

],

  

Also markus und Gerhard sind klar...aber dann...

Nur melden, wenn exakt berghütte Zillertal auftaucht

oder wenn in dem Text privat und danach irgendwo auch Berchtesgaden auftaucht...

Und die liste nach zu suchenden begriffen sollte nach Möglichkeit einfach erweitert werden können...

4 Antworten

Mit deiner Codezeile definierst du ein Array, welches einen String als Eintrag enthält. Das ist m.E. erst einmal unnötig. Offensichtlich soll der String einen regulären Ausdruck darstellen. Der kann aber schon allein aus dem Grund, dass die Reihenfolge der Vorkommen der beiden gesuchten Wörter egal sein soll, nicht passen.

Den Text eines HTML-Dokuments solltest du so bekommen:

const content = document.getElementsByTagName("body")[0].innerText;

Allerdings ist der Zeitpunkt dieses Aufrufs entscheidend, denn es könnten ja auch noch nachträglich Texte in die Webseite geladen werden.

Statt einen regulären Ausdruck zu benutzen, würde ich den Text anhand von Whitespaces (und Satzzeichen) auftrennen.

words = content.split(/[\s,\!\?\.]+/);

Wohlgemerkt: Diese Liste an Satzzeichen ist noch nicht vollständig. Auf Anhieb fielen mir da noch etliche andere ein (Anführungszeichen, Semikolons, Doppelpunkte, ...).

Danach solltest du eine Wörterliste haben, die du auf deine beiden Wörter prüfen kannst.

if (words.includes("your first word ...") && words.includes("your second word ...")) {
  // do something ...
}

Eine andere Möglichkeit wäre eine Suche mit indexOf:

const startPosition = content.indexOf("some searchword ...");

if (startPosition !== -1) {
  // ...

Um allerdings auszuschließen, dass der Fund kein Wortbestandteil ist, müssten die umliegenden Zeichen (die Zeichen direkt vor und nach dem Fund) geprüft werden. Es dürfte sich nicht um Bindestriche oder Buchstaben handeln. Vermutlich gibt es noch etliche andere Fälle.

Um den Aufwand nicht zu übertreiben, wäre es sinnvoll, die zu untersuchenden Texte im Voraus ein wenig zu analysieren: Welche Fälle sind zu erwarten und welche können ignoriert werden?

Hier mal einfach String match missbraucht

<html>
<head>
</head>
<body>
<script>
String.prototype.match = function(words) {
  for (var i = 0; i < words.length; i++) {
     if (this.indexOf(words[i]) === -1)
        return false;
  }
  return true;
}
var telefon = "Hallo wie gehts Dir mein Kücken";
var works = ["Hallo","wie"];
if ( telefon.match(works)) {
 console.log("Yes");
} else {
 console.log("No");
}
var works = ["Hallo","OK"];
if ( telefon.match(works)) {
 console.log("Yes");
} else {
 console.log("No");
}
</script>
</body>
</html>

https://jsfiddle.net/gr3yh0uc/

maestrale 
Fragesteller
 14.03.2021, 06:07

Danke, aber der text der durchsucht werden soll ist eine website

0

z.b.

function containsAll(toSearch, words) {
   for (var i = 0; i < words.length; i++) {
      if (toSearch.indexOf(words[i]) === -1)
         return false;
   }
   return true;
}
//Aufruf:
if (containsAll("Hallo Welt", [ "Hallo", "Welt", "Test"] ))

gefunden

https://mycsharp.de/forum/threads/102795/javascript-regexp-mehrere-woerter-in-ein?page=1#forumpost-3714262

crc32  14.03.2021, 03:45

Schon bevor ich mir den Fragetext durchgelesen habe, war mir klar, dass jemand so einen fehlerhaften Code schreiben wird.

Leute, schlampt nicht so! Das Testen auf Grenzfälle ist das Mindeste, was man erwarten darf!

0
TechPech1984  14.03.2021, 04:07
@crc32

hindert dich doch keiner deinen perfekten code zu antworten , aber du nörgelst nur lol . warscheinlich wurdest du von deinem chef auch einfach so vollgerotzt . hört sich gut an , klingt professionel und entspricht irgendwelchen standards lol .

hat aber überhaupt kein inhalt zum aktuellen kontext . lol

0
crc32  14.03.2021, 04:34
@TechPech1984

Du scheinst echt nicht zu verstehen, was an deinem Code falsch ist, kann das sein?

Schon mal an Überlappungen gedacht?

Nicht berücksichtigte Überlappungen sind eine der Top-Ursachen für Sicherheitslücken.

Aber deine bisherigen Antworten sind alle auf dem Niveau. Besonders die, zu C++. Naja, egal ... Pfusch mal ruhig weiter!

0

Was hat da ein falscher regulärer Ausdruck in den eckigen Klammern verloren?

Mach es dir einfach mit contains

MrAmazing2  15.03.2021, 14:03

Verwechsle es übrigens auch immer haha :D

1
codinghelp  15.03.2021, 15:03
@MrAmazing2

Ja ich mach nicht viel mit JS, sonst heißt es fast immer contains ^^

1