Hilfe:Suche/insource

Mit der Option insource: der Cirrus-Suche lässt sich der Wiki-Quelltext statt des dargestellten Seitentextes durchsuchen.

Durchsuchbarer Quelltext

Grundsätzlich kann die Option nur bei Seiten mit „normalem“ Inhalt angewendet werden; also bei solchen mit dem Content Model wikitext. Bei anderen, also wenn ausschließlich Computercode als Lua, CSS oder JavaScript enthalten ist, muss direkt gesucht werden.

Der Quelltext liegt nicht in Form einer Folge von Einzelwörtern vor wie bei der normalen Suche, sondern enthält noch die Sonderzeichen. Damit lassen sich auch URL und Vorlagenparameter finden. Leerzeichen und sonstiger Whitespace sind jeweils als ein einzelnes ASCII-Leerzeichen verschmolzen und deshalb nicht unterscheidbar.

Anders als bei der normalen Textsuche sind Vorlagen natürlich nicht expandiert; somit kann etwa der Name einer Vorlage oder eines Vorlagenparameters gefunden werden, der im dargestellten Seitentext nicht mehr enthalten ist, weil er durch den ausgewerteten Inhalt der Vorlage ersetzt wurde. Bei vollständiger und regulärer Syntax werden auch HTML-Kommentare <!-- versteckt --> nicht gefunden.

Der Quelltext der ganzen Seite kann als eine einzige Zeile aufgefasst werden; Kennern sind ^ und $ vertraut, die hier jedoch keine besondere Bedeutung haben und zunächst als normale Zeichen betrachtet werden. Jeder „Whitespace“ des Quelltextes sollte auf genau ein reguläres Leerzeichen abgebildet sein; damit existieren keine Zeilenumbrüche mehr.

Syntax

Die Syntax hat zwei Varianten:[1]

  1. insource:Wort
    • Groß- und Kleinschreibung ist nicht signifikant.
    • Es wird nur ein ganzes Wort gefunden.
    • Beispiel:
  2. insource:/RegExp/
    • RegExp ist ein regulärer Ausdruck.
    • Eine Variante wäre insource:/RegExp/i zum Ignorieren der Groß- und Kleinschreibung (was eine stärkere Serverbelastung nach sich zieht).
    • Beispiel:
      • insource:/bestimmter Suchbegriff/ findet Seiten, bei denen die Sequenz aus dem Quellcode Zeichen für Zeichen übereinstimmt. (Voraussetzung: darin sind keine Steuerzeichen für reguläre Ausdrücke enthalten; etwa .*+?/()[]{}<>^\#)

Wie bei allen Cirrus-Optionen kann zur Negation ein - (ASCII-Bindestrich) vorangestellt werden; -insource:Wort liefert alle Seiten, in deren Quelltext das „Wort“ nicht enthalten ist.

Durch Kombination mehrerer insource: und Verknüpfung mit weiteren Cirrus-Optionen können hochkomplexe Abfragen gebildet werden.

RegExp – regulärer Ausdruck

Die in vielerlei Software verfügbaren regulären Ausdrücke (regular expressions) ermöglichen die Formulierung komplexer Suchbedingungen. Grundsätzlich sind allgemeine Vorkenntnisse über diese Methodik hilfreich. Nachstehend wird die spezielle Syntax in der Cirrus-Suche zusammengestellt, soweit sie bisher ermittelt werden konnte.

Zeichen und Zeichenbereiche

Das Grundelement jeder Suche sind Zeichen. Dafür gibt es mehrere syntaktische Möglichkeiten:

Typ Syntax / Beispiel Erläuterungen
Bestimmtes Einzelzeichen B Hier: genau der Großbuchstabe B
Auch Unicode-Zeichen können in aller Regel verwendet werden.
Steuerzeichen sind zu maskieren.
Whitespace Ein Leerzeichen (Leertaste) steht für exakt ein Leerzeichen im Quelltext. Im Gegensatz zur normalen insource-Suche werden mehrere aufeinander folgende Leerzeichen nicht zu einem einzelnen Leerzeichen verschmolzen. Auch kann mit dem Leerzeichen in der RegExp-Suche kein anderer „Whitespace“ (z. B. ein Zeilenumbruch) gefunden werden.
Unbestimmtes Einzelzeichen . Der Punkt . steht für jedes beliebige Einzelzeichen, auch für Zeilenumbrüche.[2]
Mehrere Zeichen [xyz] Eine Aufzählung von Einzelzeichen ist in eckige Klammern einzuschließen, von denen dann genau eines zutreffen muss.
Zeichenbereich [a-z] Der ASCII-Bindestrich - definiert einen Bereich in der sortierten Abfolge der Unicode-Zeichen; die beiden Zeichen links und rechts des Bindestrichs geben Anfang und Ende an.
Mehrere Bereiche und Einzelzeichen können kombiniert werden.
Negation (Zeichenbereich) [^b] Ein Caret ^ am Anfang negiert den restlichen Inhalt der Klammer.
Negation (Einzelzeichen) ~b Eine Tilde ~ negiert das nächstfolgende Einzelzeichen.
Ungewöhnlich.
Belastet den Server stärker als [^b] mit gleicher Wirkung.

Beispiele:

  • Ma.s
    trifft beispielsweise „Mais“, „Mars“ und „Maus“;
  • [aeiou]
    genau eines der Zeichen „a“, „e“, „i“, „o“ oder „u“;
  • [0-6]
    eine Ziffer von „0“ bis „6“ – der Bindestrich ist Indikator für einen Bereich;
  • [A-Za-z0-9]
    ein beliebiger lateinischer Buchstabe oder eine beliebige Ziffer;
  • [^aA]
    ein beliebiges Zeichen außer „a“ oder „A“;
  • [-A-Z]
    Auswahl enthält auch den Bindestrich -, wenn er das erste Zeichen in der Aufzählung eines Zeichenbereichs ist.

Gruppierung und Verknüpfung

Von runden Klammern ( ) eingeschlossen bildet der Inhalt eine Gruppe. Mit Quantoren kann diese Gruppierung verwertet werden.

  • (Gruppe)

Pipe-Symbole | ermöglichen innerhalb des Klammerausdrucks eine Alternative (Oder-Verknüpfung) zwischen mehreren Teilausdrücken:

  • (a|b|c)
  • Irgendeiner der Teilausdrücke muss zutreffen.

Ungewöhnlich ist die Und-Verknüpfung; & zwischen mehreren Teilausdrücken:

  • (a&b)
  • Alle Teilausdrücke müssen zutreffen.
  • Vermutlich lässt sich dieses Kriterium eleganter notieren.

Die Verknüpfungen „Oder“ und „Und“ würden ohne Klammern auf die volle Länge des Ausdrucks angewendet werden.

Überraschend auch das „numerische Intervall“:

  • <i-j>
  • mit i und j aus Ziffern und i < j.
  • Trifft auf (nicht notwendigerweise gleichlange) Zifferngruppe zu, deren numerischer Wert im beschriebenen Intervall liegt.
  • Beispiel: <1871-1918>

Quantoren

Quantoren (englisch quantifier) erlauben es, den vorherigen Ausdruck in verschiedener Vielfachheit in der Zeichenkette zuzulassen. Dieser voranstehende Ausdruck kann ein Einzelzeichen oder einer der Klammerausdrücke sein.

Die Syntax entspricht allgemein üblicher Praxis.

? Der voranstehende Ausdruck ist optional, er kann einmal vorkommen, braucht es aber nicht; das heißt, der Ausdruck kommt null- oder einmal vor – entspricht {0,1}
+ Der voranstehende Ausdruck muss mindestens einmal vorkommen, darf aber auch mehrfach vorkommen – entspricht {1,}
* Der voranstehende Ausdruck darf beliebig oft (auch keinmal) vorkommen – entspricht {0,}
{n} Der voranstehende Ausdruck muss exakt n-mal vorkommen – entspricht {n,n}
{min,} Der voranstehende Ausdruck muss mindestens min-mal vorkommen.
{min,max} Der voranstehende Ausdruck muss mindestens min-mal und darf maximal max-mal vorkommen.
{0,max} Der voranstehende Ausdruck darf maximal max-mal vorkommen.

Beispiele:

  • Der Wortbestandteil von „Schifffahrt“ soll wahlweise mit zwei oder drei „f“ gefunden werden:
    • chifff?ahrt
    • chif{2,3}ahrt
  • Es wird beispielsweise „Kasus“, „Kaktus“ und „Kakao-Nuss“ gefunden:
    • Ka.+us
  • Es soll „Klingeling“, aber auch „Klingelingeling“ (und länger) gefunden werden:
    • Kling(eling)+, jetzt gibt es Geschenke

Sonderbedeutung

Die nachstehenden Zeichen haben eine Sonderbedeutung und müssen im freien Text mittels eines vorangestellten \ maskiert (escaped) werden, wenn nach ihnen in der buchstäblichen Bedeutung gesucht werden soll:

/ . * + ? ( ) [ ] { } < > | \ " ^ & # ~

Innerhalb der von eckigen Klammern eingeschlossenen Zeichenbereiche sind nur / \ ( ) ] zu maskieren.

Beispiel: insource:/\[\[Category:/ – das [ vor „Category“ würde sonst eine Zeichenauswahl begrenzen und müsste durch ] wieder geschlossen werden.

Hinweise

  • Aus Performance-Gründen wird die Zahl gleichzeitig auf dem Server verarbeiteter Abfragen dieser Art limitiert.
  • Jede Abfrage hat ein Zeit-Limit; danach wird die weitere Suche abgebrochen.
  • Jede Abfrage hat ein Treffer-Limit; es scheint bei 60.000 bis 80.000 Seiten zu liegen.
  • Statt unverbindlich mit .* zu beginnen, wodurch alle Seiten Treffer liefern, sollten möglichst einschränkende und exakte Zeichenfolgen an den Anfang des Suchausdrucks gestellt werden.
  • Durch vorangestellte andere einschränkende Cirrus-Bedingungen, die effizienter ausgewertet werden können, sollten die zu durchsuchenden Seiten reduziert werden, um keine Zeitüberschreitung auszulösen.
  • Das Flag i zum Ignorieren der Groß- und Kleinschreibung erhöht den Zeitbedarf.

Beispiele

insource:toolserver
Findet Artikel, die das Wort „toolserver“ in Groß- oder Kleinschreibung enthalten.
insource:DtRechtswörterbuch
Findet Artikel, die den Namen der Vorlage:DtRechtswörterbuch enthalten.
In der dargestellten Seite liefert DtRechtswörterbuch keine Treffer, weil die Vorlage expandiert wurde und (wie auch HTML-Kommentare) dieser Quelltext nicht mehr vorhanden ist.
\[\[Regenwald/ insource:/tropische \[\[Regenwald/
Findet Artikel, die die Zeichenkette „tropische [[Regenwald“ enthalten, beispielsweise „Der tropische Regenwald befindet […]“
insource:/in den letzten zwei Jahren/ -insource:/in den letzten zwei Jahren (seines|seiner|ihres|ihrer|vor|bis|der|des)/
Findet Seiten, die die relative Zeitangabe in den letzten zwei Jahren enthalten, dieser jedoch kein ihres, ihrer, seines, seiner, vor, bis, der oder des folgt, was auf einen fixen Bezug deutete.
Der nachgestellte Ausschluss -insource:/in den letzten zwei Jahren (seines|seiner|ihres|ihrer|vor|bis|der|des)/] schließt jedoch auch jede Seite aus, die die relative Zeitangabe mehrmals, mal mit, mal ohne eins der Ausschlusswörter enthält.
"in den letzten zwei Jahren" insource:/in den letzten zwei Jahren/ -insource:/in den letzten zwei Jahren (seines|seiner|ihres|ihrer|vor|bis|der|des)/
Mittels einer vorangestellten gewöhnlichen Suche nach der relativen Zeitangabe "in den letzten zwei Jahren" wird hier die Anzahl der Seiten stark eingegrenzt, deren Quelltext mit den regulären Ausdrücken zu analysieren ist. Dies reduziert Zeitbedarf und Serverlast.
insource:/\[\[ *Kategorie: *[^WP]/
Hier angewendet auf den Projektbereich.
Findet diejenigen Seiten, die anscheinend kategorisiert wurden, jedoch weder in die Stammkategorien Kategorie:Wikipedia: noch Kategorie:Portal: noch in anderen mit W oder P beginnenden Kategorien.
Die eckigen Klammern der Wikisyntax müssen jeweils mit \ maskiert werden.
Syntaktisch ist es in der Wikisyntax zulässig, dass zwischen den eckigen Klammern und der Kategorisierung sowie zwischen dem Namen des Namensraums und dem Titel der Kategorie Leerzeichen auftreten, ohne die Wirksamkeit zu beeinträchtigen. Dies wurde hier berücksichtigt.
Unter den Treffern sind auch Syntaxbeispiele; für eine Suche nach tatsächlich wirksamer Kategorisierung von Seiten wären besser andere Methoden als die Quelltextsuche einzusetzen.
hastemplate:NULL insource:/\| *DingsPar *=/
In allen Seiten, die {{NULL}} einbinden, soll nach einer Zuweisung des Parameters DingsPar= gesucht werden.
Das Pipe-Symbol | muss mit \ maskiert werden, da es eine eigene Bedeutung hätte.
Weil Gleichheitszeichen und Pipe-Symbol von Leerzeichen umgeben sein können, sind mit Sternchen null oder beliebig viele Leerzeichen zuzulassen; also DingsPar *= usw.
An den gewünschten Parameterwert können Bedingungen gestellt werden, also etwa das erste Zeichen aus einem Wertebereich gefordert werden.
Falls der Name DingsPar= in verschiedenen Vorlagen vorkommen könnte, kann er mit dem Namen der Vorlage verknüpft werden (sofern keine weiteren Vorlagen in Parameterwerte eingebunden sind): NULL( *\|[^}]*)?\| *DingsPar *=

Hilfsmittel

Weitere Informationen

Externe Seiten

  • RegExp-Syntax. elasticsearch.org – Herkunft der Such-Software (englisch)
  • RegExp-Syntax. lucene.apache.org – zwar nicht die aktuelle Such-Software, jedoch präzise Syntaxbeschreibung einiger ausgefallener Konstrukte (englisch)

Anmerkungen

  1. Eine dritte Variante, die exakte Zeichenketten in " einschließt, wurde aus Performance-Gründen deaktiviert.
  2. Weil die durchsuchte Textbasis keine Zeilenumbrüche mehr enthält, sondern jeder „Whitespace“ zu genau einem regulären Leerzeichen standardisiert sein sollte.