[php] regexp woorden in quotes samen nemen

Pagina: 1
Acties:
  • 118 views sinds 30-01-2008
  • Reageer

Onderwerpen


  • hobbeldebobbel
  • Registratie: Februari 2001
  • Laatst online: 15-02-2023
ik ben bezig met een soort van sql bouwer.
het zit zo. Ik krijg via een $_GET['query'] een bepaalde string doorgestuurd.

en vanuit deze string wil ik een sql string opzetten:
code:
1
$sql = "SELECT * FROM data WHERE bestand LIKE '$query[0]'  OR bestand LIKE '$query[1]' ";


stel:
code:
1
2
3
4
5
6
7
8
9
10
$_GET['query'] = "\'blauwe bak\' bakje ";
              |
              -------> $query[0] = blauwe bak
              -------> $query[1] = bakje

$_GET['query'] = "blauwe bak bakje ";
              |
              -------> $query[0] = blauwe 
              -------> $query[1] = bak
              -------> $query[2] = bakje


dingen die in 1 query[] moet komen te staan moeten mensenin kunnen vullen met een single quote. Moet ik deze dan eerst vervangen voor een ander raar teken??? of kanik gewoon \' gebruiken?

hoe kan ik dat met een regexp bereiken?
Ik weet niet eens hoe ik er eenbegin mee moet maken.; moet ik soms

[ Voor 24% gewijzigd door hobbeldebobbel op 17-02-2005 23:08 ]

hier zou een slimme opmerking kunnen staan
maar die staat er niet


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

NMe

Quia Ego Sic Dico.

Als je letterlijke quotes wil gebruiken in regular expressies moet je ze zowel de quote escapen, als het escape teken. Één keer moet je escapen voor PHP, één keer voor de regexp.
PHP:
1
"\\\'"

'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.


  • hobbeldebobbel
  • Registratie: Februari 2001
  • Laatst online: 15-02-2023
whahaha nu raak ik helemaal het spoor bijster.. niet zozeer door jouw post... maar meer door die verekte regexp's

kan iemand me op gang helpen??? waar te starten?

[ Voor 22% gewijzigd door hobbeldebobbel op 17-02-2005 23:27 ]

hier zou een slimme opmerking kunnen staan
maar die staat er niet


  • Woudloper
  • Registratie: November 2001
  • Niet online

Woudloper

« - _ - »

Wat dacht je van de P&W FAQ ([i]en wel deze sectie)? Verder kan je deze tutorial (van drm) eens doornemen, deze is namelijk erg helder van uitleg...

Acties:
  • 0 Henk 'm!

  • hobbeldebobbel
  • Registratie: Februari 2001
  • Laatst online: 15-02-2023
ok vanuit die tweede krijg ik het volgende:
dubbele quotes:
code:
1
2
3
4
5
6
<?
   $str = "string \"dit en dit\" dus";
   if ( preg_match ( '/\\"(.*?)\\"/', $str, $match ) ) {
      print_r ( $match );
   }
?>

dit resulteerd in:
code:
1
Array ( [0] => "dit en dit" [1] => dit en dit )

das dus al heel relaxed :)... alleen hij moet ook de rest matchen en in de matches array gooien dus ook string en dus.

als ik deze gebruik voor single quotes:
code:
1
2
3
4
5
6
<?
   $str = "string \'dit en dit\' dus";
   if ( preg_match ( '/\\\'(.*?)\\\'/', $str, $match ) ) {
      print_r ( $match );
   }
?>

krijg ik dit eruit:
code:
1
Array ( [0] => 'dit en dit\' [1] => dit en dit\ )

daar zit dus een \ teveel in.

hoe kan ik deze twee problemen oplossen?

[ Voor 26% gewijzigd door hobbeldebobbel op 18-02-2005 00:02 ]

hier zou een slimme opmerking kunnen staan
maar die staat er niet


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:44

crisp

Devver

Pixelated

Dit is op zich niet echt een simpel probleem, je krijgt al gauw constructies als deze:
PHP:
1
2
3
$s = '\'blauwe \\\'bak\' bakje toe\\\'ter blaat \'rode sjaal\' hallo';
preg_match_all('/(?<=\s|^)(\\\\\'|[^\'\s]+)*(\s+|$)|(?<!\\\\)\'.+?(?<!\\\\)\'/', $s, $m);
echo '<pre>', print_r($m, true), '</pre>';

;)

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • hobbeldebobbel
  • Registratie: Februari 2001
  • Laatst online: 15-02-2023
crisp held..... ik zou daar dus nooit op gekomen zijn...
damn wat veel backslashes....
met jouw string doet ie het... maar als ik hem een beetje verander dan doet ie het niet... dan lijkt het erop dat hij een \ teveel pakt of iets dergelijks:
PHP:
1
2
3
4
5
6
7
8
9
<form name=formulier method=GET atcion=<?=$PHP_SELF?>>
<input type=text name=query>
<input type=submit>
<BR><BR><BR>
<?
$s = $_GET['query'];
preg_match_all('/(?<=\s|^)(\\\\\'|[^\'\s]+)*(\s+|$)|(?<!\\\\)\'.+?(?<!\\\\)\'/', $s, $m);
echo '<pre>', print_r($m, true), '</pre>';
?>


als je dan iets invult als: licht 'blauwe doos'
dan returnt ie zoiets als dit:
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
Array
(
    [0] => Array
        (
            [0] => licht 
            [1] => \'blauwe 
            [2] => doos\'
        )

    [1] => Array
        (
            [0] => licht
            [1] => blauwe
            [2] => \'
        )

    [2] => Array
        (
            [0] =>  
            [1] =>  
            [2] => 
        )

)

welke backslash staat er teveel?

ik heb een test bestandjegemaakt op: http://pics2.sturb.nl/test.php

[ Voor 30% gewijzigd door hobbeldebobbel op 18-02-2005 13:30 ]

hier zou een slimme opmerking kunnen staan
maar die staat er niet


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:44

crisp

Devver

Pixelated

ik denk dat je magic_quotes aan hebt staan, en dus nog eerst een stripslashes over $_GET['query'] heen moet halen

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • hobbeldebobbel
  • Registratie: Februari 2001
  • Laatst online: 15-02-2023
woehaa hij stripslashed does the trick :) maaruh magic quotes nog nooit van gehoord... even googlen wat het is...

maar als ik dubbel quotes gebruik...dan doet ie het niet.... maarja dat moet maar :) of is dat ook makkelijk te veranderen?

hier zou een slimme opmerking kunnen staan
maar die staat er niet


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:44

crisp

Devver

Pixelated

snelle aanpassing voor dubbele quotes:
PHP:
1
preg_match_all('/(?<=\s|^)(\\\\\'|\\\"|[^\'"\s]+)*(\s+|$)|(?<!\\\\)([\'"]).+?(?<!\\\\)\\3/', $s, $m);

Misschien kan het wel efficienter of mooier, maar dit werkt inderdaad aardig.
Hij is eigenlijk zo ingewikkeld doordat ik escaped quotes dus oversla. Eigenlijk zou ik 'm nog moeten uitbreiden om af te vangen wanneer het escape teken zelf escaped is, maar dan wordt het wel heel erg ingewikkeld ;)

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • hobbeldebobbel
  • Registratie: Februari 2001
  • Laatst online: 15-02-2023
cirsp dit is geweldig hij werkt echt voor de juiste dingen.... alleen is er nog een probleempje. Ik kan er wel een workaround voor verzinnen, maar het zou makkelijker zijn als het direct in de regexp zit...
als ik zoek op dit 'is een' vis tussen "dubbele quotes" dan geeft hij de goede onderdelen weer:
Array
        (
            [0] => dit 
            [1] => 'is een'
            [2] => vis 
            [3] => tussen 
            [4] => "dubbele quotes"
        )

er staan dus nog steeds de ' en " in de argumenten van de array... nu kan ik die weghalen met een str_replace() maar das eigenlijk een workaround... kan je dat ook oplossen in de regexp?

hier zou een slimme opmerking kunnen staan
maar die staat er niet


Acties:
  • 0 Henk 'm!

  • hobbeldebobbel
  • Registratie: Februari 2001
  • Laatst online: 15-02-2023
ik wil de dus deze quotes eruit filteren om een sql statement te construeren uit deze zoektermen.
dit is nu de constructie:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$s = stripslashes($_GET['query']);
preg_match_all('/(?<=\s|^)(\\\\\'|\\\"|[^\'"\s]+)*(\s+|$)|(?<!\\\\)([\'"]).+?(?<!\\\\)\\3/', $s, $m);

$zoektermen = $m[0]; //dadelijk de mogelijkheid om eventueel de ' en " te verwijderen uit de termen

$aantalTermen = count($zoektermen)-1;
$veld = 'proj_buro';
$sql = 'SELECT * FROM archi_foto WHERE ';

foreach ($m[0] as $key => $value) {

  if($key ==  $aantalTermen){
      $sql .= $veld." LIKE '%".$value."%' ";
  }else{
      $sql .= $veld." LIKE '%".$value."%' or ";
  };
  
};

dit resulteert in zo'n sql statement:
SELECT * FROM archi_foto WHERE proj_buro LIKE '%blub %' or proj_buro LIKE '%dit %' or proj_buro LIKE '%'is een vis'%'


nu maak ik me een beetje zorgen over het volgende: '%blub %' en dan wel de spatie tussen het woord en de %. ik vraag me af wat de norm is voor zoekmachines als die spatie er niet is dan zoek hij ook in woorden naar de sequentie blub. Dus blubberderblub doet hij ook matchen en zou dus ongevraagde resultaten kunnen uitpoepen.
Maar
als dit het ding is: '%ddr %' zou je bijvoorbeeld het woorde ddr-regime niet matchen.....

wat is nou de norm?

hier zou een slimme opmerking kunnen staan
maar die staat er niet


Acties:
  • 0 Henk 'm!

  • MarkvE
  • Registratie: Maart 2004
  • Laatst online: 30-01 17:16
Je eerste punt is op te lossen door de quotes buiten de subexpressie te laten. En je tweede punt is wellicht het makkelijkst op te lossen met een trim () over het resultaat uit te voeren (uiteraard niet over de array zelf).

Vormkracht10


Acties:
  • 0 Henk 'm!

  • hobbeldebobbel
  • Registratie: Februari 2001
  • Laatst online: 15-02-2023
1) eeeuh sub expressie???
2) okay die whitespaces kan ik dus oplossen met trim() maar ik vraag me af of dat slim is om te doen. vraag me dan ook af wat bijvoorbeeld google doet....

hier zou een slimme opmerking kunnen staan
maar die staat er niet


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:44

crisp

Devver

Pixelated

je zou gebruik kunnen maken van non-capturing modifiers (?:foo), maar wellicht is het handiger om achteraf gewoon een trim($foo, ' "\'') over al je array-items heen te halen. Nogmaals: dit soort dingen in een regexp is vrij complex, en dat maak je ook niet 'even'. Vaak is het handiger om gewoon in een aantal stappen met minder ingewikkelde constructies tot het gewenste resultaat te komen - dat bevorderd ook zeker de onderhoudbaarheid.

Intentionally left blank

Pagina: 1