diff --git a/app/MetaGer.php b/app/MetaGer.php index e89928a242337abbfb7bad479d825151cc1f2287..1ae4df358eb0d7753eadddaefd7aff9f4aaeff5b 100644 --- a/app/MetaGer.php +++ b/app/MetaGer.php @@ -854,10 +854,7 @@ class MetaGer } # Sucheingabe $this->eingabe = trim($request->input('eingabe', '')); - if (strlen($this->eingabe) === 0) { - $this->warnings[] = trans('metaGer.formdata.noSearch'); - } - $this->q = $this->eingabe; + $this->q = strtolower($this->eingabe); # IP $this->ip = $request->ip(); # Language @@ -959,15 +956,13 @@ class MetaGer $this->searchCheckDomainBlacklist(); $this->searchCheckPhrase(); $this->searchCheckStopwords(); - - if ($this->q === "") { - $this->warnings[] = trans('metaGer.formdata.noSearch'); - } + $this->searchCheckNoSearch(); } public function searchCheckSitesearch($site) { - if (preg_match("/(.*)\bsite:(\S+)(.*)/si", $this->q, $match)) { + // matches '[... ]site:test.de[ ...]' + while (preg_match("/(^|.+\s)site:(\S+)(?:\s(.+)|($))/si", $this->q, $match)) { $this->site = $match[2]; $this->q = $match[1] . $match[3]; } @@ -978,9 +973,10 @@ class MetaGer public function searchCheckHostBlacklist() { - while (preg_match("/(.*)(^|\s)-host:(\S+)(.*)/si", $this->q, $match)) { - $this->hostBlacklist[] = $match[3]; - $this->q = $match[1] . $match[4]; + // matches '[... ]-site:test.de[ ...]' + while (preg_match("/(^|.+\s)-site:([^\s\*]\S*)(?:\s(.+)|($))/si", $this->q, $match)) { + $this->hostBlacklist[] = $match[2]; + $this->q = $match[1] . $match[3]; } if (sizeof($this->hostBlacklist) > 0) { $hostString = ""; @@ -994,9 +990,10 @@ class MetaGer public function searchCheckDomainBlacklist() { - while (preg_match("/(.*)(^|\s)-domain:(\S+)(.*)/si", $this->q, $match)) { - $this->domainBlacklist[] = $match[3]; - $this->q = $match[1] . $match[4]; + // matches '[... ]-site:*.test.de[ ...]' + while (preg_match("/(^|.+\s)-site:\*\.(\S+)(?:\s(.+)|($))/si", $this->q, $match)) { + $this->domainBlacklist[] = $match[2]; + $this->q = $match[1] . $match[3]; } if (sizeof($this->domainBlacklist) > 0) { $domainString = ""; @@ -1010,9 +1007,10 @@ class MetaGer public function searchCheckStopwords() { - while (preg_match("/(.*)(^|\s)-(\S+)(.*)/si", $this->q, $match)) { - $this->stopWords[] = $match[3]; - $this->q = $match[1] . $match[4]; + // matches '[... ]-test[ ...]' + while (preg_match("/(^|.+\s)-(\S+)(?:\s(.+)|($))/si", $this->q, $match)) { + $this->stopWords[] = $match[2]; + $this->q = $match[1] . $match[3]; } if (sizeof($this->stopWords) > 0) { $stopwordsString = ""; @@ -1028,7 +1026,8 @@ class MetaGer { $p = ""; $tmp = $this->q; - while (preg_match("/(.*)\"(.+)\"(.*)/si", $tmp, $match)) { + // matches '[... ]"test satz"[ ...]' + while (preg_match("/(^|.+\s)\"(.+)\"(?:\s(.+)|($))/si", $tmp, $match)) { $tmp = $match[1] . $match[3]; $this->phrases[] = strtolower($match[2]); } @@ -1041,6 +1040,13 @@ class MetaGer } } + public function searchCheckNoSearch() + { + if ($this->q === "") { + $this->warnings[] = trans('metaGer.formdata.noSearch'); + } + } + public function nextSearchLink() { if (isset($this->next) && isset($this->next['engines']) && count($this->next['engines']) > 0) { @@ -1214,7 +1220,7 @@ class MetaGer { $host = urlencode($host); $requestData = $this->request->except(['page', 'out', 'next']); - $requestData['eingabe'] .= " -host:$host"; + $requestData['eingabe'] .= " -site:$host"; $link = action('MetaGerSearch@search', $requestData); return $link; } @@ -1223,7 +1229,7 @@ class MetaGer { $domain = urlencode($domain); $requestData = $this->request->except(['page', 'out', 'next']); - $requestData['eingabe'] .= " -domain:$domain"; + $requestData['eingabe'] .= " -site:*.$domain"; $link = action('MetaGerSearch@search', $requestData); return $link; } diff --git a/resources/lang/de/hilfe.php b/resources/lang/de/hilfe.php index 29cdf0db557ac667aeeccf629579f8a8f21bbec8..1c8094a926a9e339d85932ef91f8bae2c02b858f 100644 --- a/resources/lang/de/hilfe.php +++ b/resources/lang/de/hilfe.php @@ -23,25 +23,28 @@ return [ "grossklein.title" => "Groß-/ Kleinschreibung", "grossklein.1" => "Groß- und Kleinschreibung wird bei der Suche nicht unterschieden, es handelt sich um eine rein inhaltliche Suche.", "grossklein.2" => "Beispiel: Die Suche nach <div class=\"well well-sm\">großschreibung</div> liefert genau die gleichen Ergebnisse wie <div class=\"well well-sm\">GROßSCHREIBUNG</div>", + "domains.title" => "Suche auf Domains beschränken / Domains ausschließen", "domains.sitesearch.explanation" => "Wenn Sie Ihre Suche nur auf Ergebnisse von einer bestimmten Domain (z.B. wikipedia.org) beschränken möchten, können Sie dies erreichen indem Sie Ihrer Suche site:<i>ihre-domain.de</i> hinzufügen.", "domains.sitesearch.example.1" => "Beispiel: Sie möchten nur noch Ergebnisse von der deutschen Wikipedia (de.wikipedia.org) erhalten. Ihre Suche lautet also:", "domains.sitesearch.example.2" => "<i>meine suche</i> site:de.wikipedia.org", "domains.sitesearch.example.3" => "Beispiel: Sie möchten auch Ergebnisse von Wikipedia in anderen Sprachen (wikipedia.org) erhalten. Ihre Suche lautet also:", "domains.sitesearch.example.4" => "<i>meine suche</i> site:wikipedia.org", - "domains.blacklist.explanation" => "Manchmal kann es auch passieren, dass Sie Ergebnisse einer bestimmten Domain nicht mehr sehen möchten. In diesem Fall haben Sie zwei Möglichkeiten: Den Ausschluss eines Hosts und den Ausschluss einer Domain. Dies erreichen Sie, indem Sie -host:<i>unterseite.ihre-seite.de</i> beziehungsweise -domain:<i>ihre-seite.de</i> zu Ihrer Suche hinzufügen.", + + "domains.blacklist.explanation" => "Manchmal kann es auch passieren, dass Sie Ergebnisse einer bestimmten Domain nicht mehr sehen möchten. In diesem Fall haben Sie zwei Möglichkeiten: Den Ausschluss einer Subdomain und den Ausschluss einer Top-Level-Domain. Dies erreichen Sie, indem Sie -site:<i>unterseite.ihre-seite.de</i> beziehungsweise -site:*.<i>ihre-seite.de</i> zu Ihrer Suche hinzufügen.", "domains.blacklist.example.1" => "Beispiel: Sie haben genug von den ganzen Wikipedia-Ergebnissen. Nun haben Sie zwei Möglichkeiten:", "domains.blacklist.example.2" => "Sie schließen alle Ergebnisse von der deutschen Wikipedia-Domain, also de.wikipedia.org, aus", - "domains.blacklist.example.3" => "<i>meine suche</i> -host:de.wikipedia.org", + "domains.blacklist.example.3" => "<i>meine suche</i> -site:de.wikipedia.org", "domains.blacklist.example.4" => "Sie erhalten nun weiterhin Ergebnisse von beispielsweise en.wikipedia.org, solange diese zu Ihrer Suche passen", "domains.blacklist.example.5" => "Sie schließen generell alle Ergebnisse von allen Wikipedia-Domains aus", - "domains.blacklist.example.6" => "<i>meine suche</i> -domain:wikipedia.org", - "domains.showcase.explanation.1" => "Zusätzlich bieten wir Ihnen die Möglichkeit Hosts beziehungsweise Domains direkt auf der Ergebnisseite auszuschließen. Bei jedem unserer Ergebnisse erscheint dieses kleine Symbol für die Optionen:", + "domains.blacklist.example.6" => "<i>meine suche</i> -site:*.wikipedia.org", + "domains.showcase.explanation.1" => "Zusätzlich bieten wir Ihnen die Möglichkeit Subdomains beziehungsweise Top-Level-Domains direkt auf der Ergebnisseite auszuschließen. Bei jedem unserer Ergebnisse erscheint dieses kleine Symbol für die Optionen:", "domains.showcase.explanation.2" => "Wenn Sie auf dieses Symbol klicken, erscheint folgendes Menü:", "domains.showcase.menu.1" => "Mit diesem Menü lassen sich:", "domains.showcase.menu.2" => "Eine neue Suche nur auf der Domain des Ergebnisses (de.wikipedia.de) starten", "domains.showcase.menu.3" => "Eine Suche ohne Ergebnisse der Subdomain (de.wikipedia.de) starten", "domains.showcase.menu.4" => "Eine Suche ohne Ergebnisse der Top-Level-Domain (wikipedia.de) starten", + "dienste" => "Weitere Dienste um die Suche herum", "app.title" => "Android-App", "app.1" => "Sie können MetaGer auch als App nutzen. Laden Sie sich dazu einfach die <a href=\"https://play.google.com/store/apps/details?id=de.metager.metagerapp\" target=\"_blank\" rel=\"noopener\">MetaGer App</a> auf ihr Android Smartphone.", diff --git a/resources/lang/en/hilfe.php b/resources/lang/en/hilfe.php index 6717328d864f0734724076911151892a90396167..e865c28fb0358176990d4f8f6fd262479aee599d 100644 --- a/resources/lang/en/hilfe.php +++ b/resources/lang/en/hilfe.php @@ -29,13 +29,13 @@ return [ "domains.sitesearch.example.2" => "<i>my search words</i> site:en.wikipedia.org", "domains.sitesearch.example.3" => "Example: Restriction to wikipedia but all languages:", "domains.sitesearch.example.4" => "Type: <i>my search words</i> site:wikipedia.org", - "domains.blacklist.explanation" => "Exclude a specific domain: Either the exclusion of a host or of a domain. Type <i>my search words</i> -host:<i>en.wikipedia.org</i> or <i>my search words</i> -domain:<i>wikipedia.org</i>", - "domains.blacklist.example.1" => "Example: You don't want to get results from Wikipedia. There are two possibilities:", + "domains.blacklist.explanation" => "Exclude a specific domain: Either the exclusion of a subdomain or of a top level domain. Type <i>my search words</i> -site:<i>en.wikipedia.org</i> or <i>my search words</i> -site:*.<i>wikipedia.org</i>", + "domains.blacklist.example.1" => "Example: You do not want to get results from Wikipedia. There are two possibilities:", "domains.blacklist.example.2" => "Exclude results from the english Wikipedia (domain) so <i>en.wikipedia.org</i>", - "domains.blacklist.example.3" => "<i>my search words</i> -host:<i>en.wikipedia.org</i>", + "domains.blacklist.example.3" => "<i>my search words</i> -site:<i>en.wikipedia.org</i>", "domains.blacklist.example.4" => "You get results from e.g. de.wikipedia.org further on.", "domains.blacklist.example.5" => "Exclude all results of all wikipedia domains:", - "domains.blacklist.example.6" => "<i>my search words</i> -domain:<i>wikipedia.org</i>", + "domains.blacklist.example.6" => "<i>my search words</i> -site:*.<i>wikipedia.org</i>", "domains.showcase.explanation.1" => "Additionally there is the option to exclude hosts or domains on the result page: All of the results have the small triangle sign:", "domains.showcase.explanation.2" => "Click for the menu shown below:", "domains.showcase.menu.1" => "Decide here:", diff --git a/tests/MetaGerPhpTest.php b/tests/MetaGerPhpTest.php index 845e7b97518b73b9541da7d536ceac475715ed7b..eb707fc55fc4f728c58d3c3d9431014117a18291 100644 --- a/tests/MetaGerPhpTest.php +++ b/tests/MetaGerPhpTest.php @@ -43,20 +43,14 @@ class MetaGerPhpTest extends TestCase // Testet das erkennen von Spezialsuchen in verschiedenen Sucheingaben public function specialSearchTest() { - $metager = new MetaGer(); - $request = new Request(['eingabe' => 'suchwort -blackword -host:blackhost -domain:blackdomain site:wantsite "i want phrase"']); - $metager->parseFormData($request); - $metager->checkSpecialSearches($request); + $metager = $this->createSpecialSearchMetager('suchwort -blackword -site:blackhost -site:*.blackdomain site:wantsite "i want phrase"'); $this->assertEquals("wantsite", $metager->getSite()); $this->assertContains("blackhost", $metager->getUserHostBlacklist()); $this->assertContains("blackdomain", $metager->getUserDomainBlacklist()); $this->assertContains("blackword", $metager->getStopWords()); $this->assertContains("i want phrase", $metager->getPhrases()); - $metager = new MetaGer(); - $request = new Request(['eingabe' => '-site:peter:test -blackword-test -host:blackhost-test.de.nz/test ich suche nach -host:blackhost:blackhost2.cote/t?p=5 "peter ist obst-garten und -bauern"']); - $metager->parseFormData($request); - $metager->checkSpecialSearches($request); + $metager = $this->createSpecialSearchMetager('site:peter:test -blackword-test -site:blackhost-test.de.nz/test ich suche nach -site:blackhost:blackhost2.cote/t?p=5 "peter ist obst-garten und -bauern"'); $this->assertEquals("peter:test", $metager->getSite()); $this->assertContains("blackhost:blackhost2.cote/t?p=5", $metager->getUserHostBlacklist()); $this->assertContains("blackhost-test.de.nz/test", $metager->getUserHostBlacklist()); @@ -64,17 +58,28 @@ class MetaGerPhpTest extends TestCase $this->assertNotContains("bauern", $metager->getStopWords()); $this->assertContains("peter ist obst-garten und -bauern", $metager->getPhrases()); - $metager = new MetaGer(); - $request = new Request(['eingabe' => '-host:-domain:test']); - $metager->parseFormData($request); - $metager->checkSpecialSearches($request); - $this->assertContains("-domain:test", $metager->getUserHostBlacklist()); + $metager = $this->createSpecialSearchMetager('-site:-site:*.test'); + $this->assertContains("-site:*.test", $metager->getUserHostBlacklist()); + + $metager = $this->createSpecialSearchMetager('"-site:-site:*.test"'); + $this->assertContains("-site:-site:*.test", $metager->getPhrases()); + + $metager = $this->createSpecialSearchMetager('site:wikipedia.de apfel site:test.de tomate'); + $this->assertEquals("apfel tomate", $metager->getQ()); + $this->assertEquals("test.de", $metager->getSite()); + $metager = $this->createSpecialSearchMetager('site:wikipedia.de'); + $this->assertEquals("", $metager->getQ()); + $this->assertEquals("wikipedia.de", $metager->getSite()); + } + + public function createSpecialSearchMetager($eingabe) + { $metager = new MetaGer(); - $request = new Request(['eingabe' => '"-host:-domain:test"']); + $request = new Request(['eingabe' => $eingabe]); $metager->parseFormData($request); $metager->checkSpecialSearches($request); - $this->assertContains("-host:-domain:test", $metager->getPhrases()); + return $metager; } // Testet, ob ein Link wirklich nur einmal hinzugefügt werden kann @@ -141,9 +146,9 @@ class MetaGerPhpTest extends TestCase $this->containCallbackTester($metager, "generateSiteSearchLink", ["wolf.de"], 'site%3Awolf.de'); $this->containCallbackTester($metager, "generateRemovedHostLink", ["wolf.de"], - '-host%3Awolf.de'); + '-site%3Awolf.de'); $this->containCallbackTester($metager, "generateRemovedDomainLink", ["wolf.de"], - '-domain%3Awolf.de'); + '-site%3A%2A.wolf.de'); } // Prüft ob der Host Count funktioniert @@ -329,7 +334,7 @@ class MetaGerPhpTest extends TestCase #new Request(array $query = array(), array $request = array(), array $attributes = array(), array $cookies = array(), array $files = array(), array $server = array(), $content = null) $query = []; - $query["eingabe"] = 'suchwort -blackword -host:blackhost -domain:blackdomain site:wantsite "i want phrase"'; + $query["eingabe"] = 'suchwort -blackword -site:blackhost -site:*.blackdomain site:wantsite "i want phrase"'; $query["focus"] = "angepasst"; $query["encoding"] = "utf8"; $query["lang"] = "all"; diff --git a/tests/ResultPhpTest.php b/tests/ResultPhpTest.php index 341280f30226d39935c6cca388ec034fb646c0d0..409d0dad96b72f137cc2cf439d57330d73ccdf18 100644 --- a/tests/ResultPhpTest.php +++ b/tests/ResultPhpTest.php @@ -78,7 +78,7 @@ Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod $this->assertTrue($result->isValid($metager)); $metager = new MetaGer(); - $request = new Request(['eingabe' => 'test -host:host.domain.de -domain:domain.de']); + $request = new Request(['eingabe' => 'test -site:host.domain.de -site:*.domain.de']); $metager->parseFormData($request); $metager->checkSpecialSearches($request); @@ -99,7 +99,7 @@ Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod $this->assertFalse($result->isValid($metager)); } - // Prüft die Funktionen die Links umformen oder erzeugen + // Prüft die Funktionen, die Links umformen oder erzeugen public function linkGeneratorsTest() { $result = $this->getDummyResult(); @@ -120,6 +120,13 @@ Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod 'solo.de'); $this->equalCallbackTester($result, "getStrippedLink", [$url], 'han.solo.de/unterseite/document.htm'); + + $url = "http://www.foo.bar.han.solo.de/test?ja=1"; + + $this->equalCallbackTester($result, "getStrippedHost", [$url], + 'foo.bar.han.solo.de'); + $this->equalCallbackTester($result, "getStrippedDomain", [$url], + 'solo.de'); } /**