[PHP] 'Search String' splitten (met preg_split)

Pagina: 1
Acties:

Onderwerpen


  • Erkel
  • Registratie: Mei 2006
  • Laatst online: 19-09 11:11
Geachte mede tweakers,

Ik ben momenteel bezig met een zoekpagina. Een simpele zoekopdracht werkt inmiddels, maar wat ik nu voor elkaar probeer te krijgen is dat worden tussen ' ' als 1 woord of string worden gezien.

Als een gebruiker zoekt op het volgende (voorbeeldje):

'pdf converter' html text

Moet er gematched worden op: pdf converter, html, text. Ik wilde daarvoor preg_split gebruiken, en doe dat als volgt:
PHP:
1
$keywords = preg_split("/'*'/", $zoekstring);


Nu krijg ik dus het volgende met het bovenstaande voorbeeld:
Array
(
[0] =>
[1] => pdf converter
[2] => html text
)

Op zich is pdf converter er mooi uitgekomen als 1 waarde, maar "html text" heeft nu dezelfde opbouw als "pdf converter". Dus als ik de andere keys wil gaan splitsen met een spatie, wordt pdf converter ook gesplitst en gaat dat dus aan het doel voorbij.

Eerst splitsen op spatie werkt ook niet want dan wordt pdf converter meteen gesplitst. Nu zou ik natuurlijk kunnen zoeken op de string die tussen de ' ' staat en die uit de array gooien en vervolgens splitsen, maar dat lijkt mij nogal omslachtig.

Ik kon via google ook geen mooie oplossing vinden. Dus ik hoopte dat hier misschien iemand een suggestie had.Waarschijnlijk kijk ik over een hele simpele oplossing heen, ik zit er nu al een tijdje naar te staren en te proberen, maar ik ben niet zo een held met preg_split.

Als er meer info nodig is, laat het even weten. Dan zal ik dat toevoen toevoegen.

C2D E6600 - 2048MB Kingston - Sapphire HD2900XT - 200Gb Samsung - Asus P5B-E


Verwijderd

Met een preg_replace moet je er dit van kunnen maken volgensmij:

'pdf converter' 'html' 'text'

Als je dan vervolgens die preg_split doet komt het er wel goed uit. Of zit ik nou fout...

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Ik zou dit zelf niet met preg_split op willen lossen, maar hier een simpele parser voor schrijven. Maar als je het dan toch met preg_split wil doen zul je inderdaad met wat replaces aan de gang moeten gaan. IMO een stuk complexer dan een simpele parser. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Erkel
  • Registratie: Mei 2006
  • Laatst online: 19-09 11:11
Het hoeft niet per se met preg_match / split / replace. Maar met het schrijven van een parser zou ik niet weten waar ik zou moeten beginnen, maar ik zal me daar is in verdiepen. Als je een suggestie hebt, of een goede tutorial, dat zou zeer welkom zijn:)

C2D E6600 - 2048MB Kingston - Sapphire HD2900XT - 200Gb Samsung - Asus P5B-E


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

De simpelste oplossing zonder parser: splitsen op spaties. Vervolgens de hele array doorlopen en kijken of één van de zoekwoorden begint met een '. Zo ja: de volgende zoekwoorden ermee samenvoegen tot je er een tegenkomt met een ' aan het einde. Vergeet niet achteraf die omsluitende quotes te verwijderen, en bedenk je dat niets je gebruiker tegenhoudt om één woord ook met quotes te omsluiten. Bovendien is het zo mogelijk om 'twintig pagina's' goed te interpreteren, ondanks de apostrof in pagina's. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Jasperrr
  • Registratie: Augustus 2008
  • Laatst online: 10-09 11:35
Alsjeblieft Erkel, dit moet het doen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
$zoekstring = "'pdf converter lang' html text"; // even een test zoekstring

$keywords = preg_split("/'*'/", $zoekstring); // split op quotes
$key = 0; // set array keyword teller op 0

foreach ($keywords as $keyword){ // controller alle keywords
    if (preg_match("/'".$keyword."'/i", $zoekstring)) { // is het een multi-keyword? doe er dan niks mee
        $keys[$key] = $keyword;
        $key++;
    } else {
        $split = preg_split("/\s/", $keyword); // is het een single keyword? split het op spaties
        foreach ($split as $temp){
            if(!$temp == ""){ // even de lege plekken van de 's eruit werken
                $keys[$key] = $temp;
                $key++;
            }
        }
    }
}
foreach ($keys as $blaat){
echo $blaat."<br />"; // echo alle arrays
}
?>


Input:
code:
1
'pdf converter lang' html text


Geeft als output:
code:
1
2
3
[0] => pdf converter lang
[1] => html
[2] => text


Edit: Natuurlijk is het gecomment :*)

[ Voor 18% gewijzigd door Jasperrr op 24-09-2008 20:31 ]


  • Sebazzz
  • Registratie: September 2006
  • Laatst online: 17:23

Sebazzz

3dp

Dat is natuurlijk niet de manier hè ;) Er zit een subtiel verschil tussen helpen en voorkauwen.

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]


  • Patriot
  • Registratie: December 2004
  • Laatst online: 19:24

Patriot

Fulltime #whatpulsert

-NMe- schreef op woensdag 24 september 2008 @ 16:34:
De simpelste oplossing zonder parser: splitsen op spaties. Vervolgens de hele array doorlopen en kijken of één van de zoekwoorden begint met een '. Zo ja: de volgende zoekwoorden ermee samenvoegen tot je er een tegenkomt met een ' aan het einde. Vergeet niet achteraf die omsluitende quotes te verwijderen, en bedenk je dat niets je gebruiker tegenhoudt om één woord ook met quotes te omsluiten. Bovendien is het zo mogelijk om 'twintig pagina's' goed te interpreteren, ondanks de apostrof in pagina's. ;)
Maar -NMe-, dat is dan toch gewoon een parser? :P

  • Jasperrr
  • Registratie: Augustus 2008
  • Laatst online: 10-09 11:35
Sebazzz schreef op woensdag 24 september 2008 @ 21:37:
Dat is natuurlijk niet de manier hè ;) Er zit een subtiel verschil tussen helpen en voorkauwen.
Whoops, je hebt gelijk :)

Ik zal voortaan maar weer gewoon hints geven en indien erom gevraagd wordt, ook stukjes code ;)

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Jasperrr schreef op woensdag 24 september 2008 @ 21:53:
Ik zal voortaan maar weer gewoon hints geven en indien erom gevraagd wordt, ook stukjes code ;)
Ja, te lang is geen goed idee ;)
PHP:
1
2
3
4
5
6
$zoekstring = "'pdf converter lang' html text"; // even een test zoekstring

if (preg_match_all("/'[^']*(?:'|$)|[^' ]+/",$zoekstring,$matches))
    $keys=array_map(create_function('$v','return trim($v,"\'");'),$matches[0]);

echo join($keys,"<br />");

Aangezien de code er nu al staat, laat ik ontdekken wat het doet en het aanpassen aan dingen als pagina's' en alex' aan TS over ;) (Keyword hints: ungreedy, look-forward; verder zou ik een 'echte' functie dequote maken.)

[ Voor 20% gewijzigd door pedorus op 25-09-2008 00:53 . Reden: -NMe- beter gelezen ]

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Patriot schreef op woensdag 24 september 2008 @ 21:41:
[...]

Maar -NMe-, dat is dan toch gewoon een parser? :P
True, deels. :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • supakeen
  • Registratie: December 2000
  • Laatst online: 09-09 14:42
Als je een MySQL fulltext search doet is het goed invoeren van deze tekens in je query (met behulp van enkele standaard functies) voldoende. Niks te parser, regular expressions etcetera.

Maar ik weet natuurlijk niet welke achterliggende code hierop hangt ;)
Pagina: 1