zoeken met quotes

Status
Niet open voor verdere reacties.

RMS123

Gebruiker
Lid geworden
15 nov 2009
Berichten
873
Hallo,

Ik ben een zoekfunctie voor een site aan het maken, die werkt nu, maar ik wil hem iets uitbreiden.

Wat de zoekfunctie als eerste doet is alles zoekwoorden los maken van elkaar dmv de explode functie op de spaties.
Alleen wat bijv. ook in google kan is naar ["a b c"] zoeken (dus met quotes eromheen), ipv naar [a b c], het resultaat is dat dan wordt gezocht naar a b c als 1 woord, ipv als 3 woorden.

Wat dus moet gebeuren is:
1. de string komt binnen, wordt getrimed, ge lowercased etc.
2. de quoted text wordt eruitgefilterd, in de array met zoekwoorden gezet, en vervolgens UIT de zoekstring gehaald.
3. de string (waar dus geen quotes meer in staan) wordt op spaties gesplit.


stap 2 op andere topics aanbevolen werd http://php.net/manual/en/function.preg-match.php aanbevolen voor dit soort zaken, alleen daar kom ik er nog niet helemaal uit, omdat ik nooit met deze functie heb gewerkt en er eigenlijk niet veel van snap.

Kan iemand mij opweg helpen? en is het hiermee ook mogelijk om meerdere quoted zoekteremen te gebruiken?

alvast bedankt.

PS: mij alternatief waar ik eerst mee bezig ben geweest is:
PHP:
$quotedparts = explode("\"", $zoekstring);
$stringNIETquoted = "";
$stringWELquoted = "";
$i = 0;
foreach ($quotedparts as $quotedpart) {
	if ($i & 1 == 1) {
		$stringNIETquoted .= $quotedpart;
	} else {
		$stringWELquoted .= $quotedpart;
	}
	$i++;
}
Maar dit is niet een bepaald bug-vrije code
 
regular expressions zijn inderdaad vaak de meest robuste methode om dergelijke zaken te doen.

Een handige site om te hebben: http://www.regular-expressions.info/reference.html

Regular expressions zoeken naar patronen in de string die je meegeeft. In dit geval zoek je een redelijk simpel patroon, namelijk "" en alles daartussen.

Als je preg_match_all gebruikt met PREG_OFFSET_CAPTURE krijg je ook de start positie in de string waar je match begint. Omdat je ook de lengte weet van elke match kun je dat meteen gebruiken om deze matches uit je string te knippen nadat je alles tussen quotes behandeld hebt.

Verwacht je alleen de text of de text met de omringende quotes?

PHP:
preg_match_all('|".*?"|', $input_string, $matches, PREG_OFFSET_CAPTURE);
print_r($matches);
 
Okey bedankt ik ga meteen aan de slag. Je hoort nog of het gelukt is :thumb:

EDIT: kan de pre_match ook zo aan worden gepast dat de quotes er al af zijn?
 
Laatst bewerkt:
ja, alleen moet je dan niet vergeten die wel weg te halen, of in ieder geval rekening mee te houden bij verdere bewerking.

PHP:
preg_match_all('|"(.*?)"|', $input_string, $matches, PREG_OFFSET_CAPTURE);
print_r($matches);

Je array wordt nu groter. 1 array bevat de antwoorden met quotes, de andere zonder quotes (als het goed is, kan pas later vanmiddag zelf testen)
 
Alles opgelost bedankt!

Mijn code:
PHP:
function searchto($tag, $studyspath) {
	$tag = strtolower(trim(str_replace(chr(92), "", $tag)));
	if ($tag == "" || $tag == " ") return false;
	echo "Zoeken naar: \"" . $tag . "\"<br />";
	$tags1 = array();

	preg_match_all('|".*?"|', $tag, $matches, PREG_OFFSET_CAPTURE);

	foreach ($matches[0] as $match) {
		array_push($tags1, substr(substr($match[0], 0, -1), 1));
		$tag = str_replace("\"" . $match[0] . "\"", "", $tag);
	}
	
	trim($tag);
	$tags2 = explode(" ", $tag);
	$tags = array_merge($tags1, $tags2);
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan