login  Naam:   Wachtwoord: 
Registreer je!
 Forum

phpbron splitsen

Offline avdg - 30/10/2007 18:39 (laatste wijziging 31/10/2007 08:45)
Avatar van avdgPHP gevorderde Ik zou graag een code willen hebben voor het splitsen van php-code in een deel tussen de " of ' en zonder. Ook zou het escapetekens herkennen. Uiteindelijk moet degene tussen haakjes false bevatten:

bv.
  1. echo "<input type=\"text\" name=\"name\">";


splitsen in: (in een array)
  1. $text[0] = "echo";
  2. $text[0]["uithaakjes"] = true;
  3. $text[1] = "\"<input type=\\\"text\\\" name=\\\"name\\\">\"";
  4. $text[1]["uithaakjes"] = false;
  5. $text[2] = ";";
  6. $text[2]["uithaakjes"] = true;


Graag bedankt, want het is niet zo makkelijk  en ik ben niet vertrouwd met reguliere expressies

Edit: ik zou dat graag in een functie hebben met $tekst en $escape (escapeteken: in php \) als parameters

Edit2: code is aangepast volgens Stijn1989 zijn wensen.

Ik ben trouwens redelijk wat online op de chat: mischien ben ik wel online en kan ik wat vragen beantwoorden.

13 antwoorden

Gesponsorde links
Offline Stijn - 30/10/2007 19:40
Avatar van Stijn PHP expert Moest je nu eens je vraag duidelijkere formuleren, dan zouden we er iets van begrijpen.

Leg eens duidelijk uit wat je wil bereiken.

Een opmerking:

Dit is verkeerd.
  1. $text[2][uithaakjes] = true;


Dit is correct.
  1. $text[2]['uithaakjes'] = true;
Offline Wim - 30/10/2007 20:00
Avatar van Wim Crew algemeen
  1. <?php
  2. $string = '<input type="text" name="name" \>';
  3. $options = explode(' ', $string);
  4. foreach ($options as $option)
  5. {
  6. if(preg_match('#"#', $option))
  7. {
  8. list($option[$i], $value[$i++]) = explode('"', $option);
  9. }
  10. }
  11.  
  12. print_r($options);
  13. print_r($value);


zoiets?
anders begrijp ik je vraag niet
Offline avdg - 30/10/2007 20:07 (laatste wijziging 30/10/2007 22:17)
Avatar van avdg PHP gevorderde euh, er staat in een function.

Citaat:
Rens edit:
Euh, er word hier verwacht dat je er zelf ook wat moeite voor doet.
En als je wilt dat iemand het script voor je schrijft ga je maar naar Samenwerken.
Offline Grayen - 30/10/2007 22:54 (laatste wijziging 30/10/2007 23:10)
Avatar van Grayen PHP ver gevorderde Altijd leuk van deze functies schrijven . Wel zou ik nog even graag willen weten wat je van plan bent met deze functie, want ik zie het nut er niet helemaal van in .

  1. <?php
  2. /*
  3.   De functie maakt van een string php code een array met als
  4.   items telkens het deel zich binnen quotes bevindt of niet.
  5.  
  6.   $sCode = De string php code. Voorbeeld van hoe je die in een variable kan plaatsen,
  7.   zonder gedoe met quotes
  8.  
  9.   $sCode = <<<code
  10.   echo "<input type=\"text\" name\"name\">";
  11.   code;
  12. */
  13. function getQuoteArray($sCode, $sEscape = '\\')
  14. {
  15. // De lengte van de code.
  16. $iLength = strlen($sCode);
  17.  
  18. // Geef de vars met booleans standaard de waarde false.
  19. $bQuoteOpen = $bEscape = false;
  20.  
  21. $aQuote = array();
  22.  
  23. $sItem = '';
  24.  
  25. // Een for loopje om elke karakter binnen $sCode te kunnen krijgen in een aparte var.
  26. for ($i = 0; $i < $iLength; $i++)
  27. {
  28. // Het karakter $i binnen $sCode.
  29. $s = $sCode[$i];
  30.  
  31. // Is het een quote die niet gebackslashed is?
  32. if (($s == '"' || $s == "'") && !$bEscape)
  33. {
  34. $aQuote[] = array($sItem, $bQuoteOpen);
  35.  
  36. // Was de boolean true? maak hem dan false en andersom als hij false is dan moet hij true worden.
  37. $bQuoteOpen = $bQuoteOpen ? false : true;
  38.  
  39. // Leeg de item string weer voor het volgende item.
  40. $sItem = '';
  41. }
  42. // Is de maximale lengte behaald?
  43. else if ($i == $iLength - 1)
  44. {
  45. // Zorg ervoor dat ook de laatste karakter die niet aan $sItem is meegegeven opgeslagen wordt.
  46. $sItem = !empty($sItem) ? $sItem.$s : $s;
  47.  
  48. $aQuote[] = array($sItem, $bQuoteOpen);
  49. }
  50. else
  51. {
  52. // Is het karkater een escape teken?
  53. $bEscape = $s == $sEscape ? true : false;
  54.  
  55. // Voeg de karakter toe aan de item string.
  56. $sItem .= $s;
  57. }
  58. }
  59.  
  60. return $aQuote;
  61. }
  62. ?>


Ik heb nog even die tweede parameter toegevoegd, wat je zei in je topic, niet dat hij veel nu zal hebben, maar goed...
Offline avdg - 31/10/2007 08:21 (laatste wijziging 31/10/2007 08:46)
Avatar van avdg PHP gevorderde klein foutje (waarschijnlijk aan mijn uitleg), de $escape vermeld welk teken de escape is, voor de rest vind ik het een goed script, bedankt Grayen   

Die escape teken dient om later nog talen toe te voegen, (wat weer moeilijker maakt) en bv. html ondersteund dat niet...

Euh.. srr, maar er staat een fout in mijn voorbeeld: name=\"name\">
dat was name\"name\">
Offline Grayen - 31/10/2007 08:45
Avatar van Grayen PHP ver gevorderde Maar waarvoor wil je het script gaan gebruiken? Je zegt al dat je het later voor meer talen wilt gaan gebruiken, maar wat is dat het nut om strings te scheiden van andere code? Misschien highlighting? Zou je dat nog even willen vertellen?
Offline avdg - 31/10/2007 08:47 (laatste wijziging 31/10/2007 09:00)
Avatar van avdg PHP gevorderde Het lijkt erop, ik wil later zo een engine die alle onnodige tekens eruit kan parsen.

En verder, ik heb wat foutjes gevonden, ik probeer het zelf nog eens.
Nog een probleempje: hoe herkent hij herodoc (srr dat ik het nu pas vraag).
Het is echt een goede code hoor!

@grayen: Werkt die 2de parameter ook met 1 \?
Edit, ik snap al, het is maar een escapeteken...
Offline Grayen - 31/10/2007 09:05
Avatar van Grayen PHP ver gevorderde herdoc... hmm wat was dat ook alweer ik ken bijna alles maar niet bij naam . Je bedoelt zeker <<<code.....code; of niet? Kan ik er ook wel inbouwen, maar niet nu want moet zo naar school.

nee, die '\\' = \, want om een backslash als karakter in een string te krijgen moet je twee backslahes doen (dus een gebackslashde backslash ), omdat een enkele backslash binnen een string (tussen enkele en dubbele quotes) de functie heeft om speciale tekens mee uit te drukken \n \r \t bijvoorbeeld.
Offline avdg - 31/10/2007 09:23 (laatste wijziging 01/11/2007 09:46)
Avatar van avdg PHP gevorderde Al 1 ding gevonden:
omdat $sEscape een optionele var is moet de lengte ook gecontroleerd worden:

regel 53 veranderen naar
  1. // Is het karkater een escape teken?
  2. if(strlen($sEscape)>0) $bEscape = $s == $sEscape ? true : false;

Edit: mijn versie nu:
  1. function getQuoteArray($sCode, $sEscape = '\\'){
  2. // De lengte van de code.
  3. $iLength = strlen($sCode);
  4.  
  5. // Geef de vars met booleans standaard de waarde false.
  6. $bQuoteOpen = $bEscape = false;
  7.  
  8. $aQuote = array();
  9.  
  10. $sItem = $sLast_Quote = '';
  11.  
  12. // Een for loopje om elke karakter binnen $sCode te kunnen krijgen in een aparte var.
  13. for ($i = 0; $i < $iLength; $i++){
  14. // Het karakter $i binnen $sCode.
  15. $s = $sCode[$i];
  16.  
  17. // Is het een quote die niet gebackslashed is?
  18. if (($s == '"' || $s == "'") && !$bEscape){
  19. if($bQuoteOpen){
  20. //Bij sluiten controleren of het item wel het openingsteken was
  21. //Die bij de opening er was
  22. if($s==$sLast_Quote){
  23. //last_quote weer leegmaken
  24. $sLast_Quote = '';
  25. $aQuote[] = array($s.$sItem.$s, $bQuoteOpen);
  26. // Bool wordt false
  27. $bQuoteOpen = false;
  28. // Leeg de item string weer voor het volgende item.
  29. $sItem = '';
  30. }
  31. }else{
  32. //
  33. $aQuote[] = array($sItem, $bQuoteOpen);
  34. $sLast_Quote = $s;
  35. // Bool wordt true
  36. $bQuoteOpen = true;
  37. // Leeg de item string weer voor het volgende item.
  38. $sItem = '';
  39. }
  40. }
  41. // Is de maximale lengte behaald?
  42. else if ($i == $iLength - 1){
  43. // Zorg ervoor dat ook de laatste karakter die niet aan $sItem is meegegeven opgeslagen wordt.
  44. $sItem = !empty($sItem) ? $sItem.$s : $s;
  45.  
  46. $aQuote[] = array($sItem, $bQuoteOpen);
  47. }else{
  48. // Is het karkater een escape teken? Controleer wel of er 1 is
  49. if(strlen($sEscape)>0){
  50. if($s == $sEscape)$bEscape = true;
  51. else $bEscape = false;
  52. }
  53. // Voeg de karakter toe aan de item string.
  54. $sItem .= $s;
  55. }
  56. }return $aQuote;
  57. }

opmerkingen:
53 (51-54) is uitgerekt, naar wens van marten
Als die code langer is word het aangeraden plaatscode te gebruiken
Die code mag geen tekenverlies lijden.
Nog 1 probleempje is niet opgelost: herdoc notatie (ja het was dat Grayen)
Ik zou dan nog een parameter moeten maken met $bPHP voor herkenning...

Zeg maar als hem vast loopt...

Edit: nu is het uitgeschreven Marten 
Offline marten - 31/10/2007 09:29
Avatar van marten Beheerder Ik zie liever de if / else volledig uitgeschreven.
Offline avdg - 31/10/2007 10:59 (laatste wijziging 31/10/2007 11:00)
Avatar van avdg PHP gevorderde Van die heredoc, het is heredoc
zie http://en.wikipedia.org/wiki/Here_document
het is wikipedia, maar alleen in het Engels...
Offline delta_004 - 31/10/2007 17:05
Avatar van delta_004 Onbekend Dit is zo een idioot script hoor. Gewoon explode ofzo?
Offline avdg - 01/11/2007 10:41 (laatste wijziging 01/11/2007 12:10)
Avatar van avdg PHP gevorderde Kleine wijziging:
bug opgelost: escapeteken die al geëscaped is mag niet meegerekend worden (regel 52). 

Nog nodig:
-Heredoc moet ook gefilterd worden (ik probeer er zelf nog aan te werken, maar daar heb ik wat hulp nodig)
-Iemand die slim genoeg is om nog fouten uit te halen
-Graag suggesties wat er beter kan aan de code

Opmerking: die for ga ik best veranderen in een while (voor die heredoc)
  1. function getQuoteArray($sCode, $sEscape = '\\', $bPHP = true){
  2. // De lengte van de code.
  3. $iLength = strlen($sCode);
  4.  
  5. // Geef de vars met booleans standaard de waarde false.
  6. $bQuoteOpen = $bEscape = false;
  7.  
  8. $aQuote = array();
  9.  
  10. $sItem = $sLast_Quote = '';
  11.  
  12. // Een for loopje om elke karakter binnen $sCode te kunnen krijgen in een aparte var.
  13. for ($i = 0; $i < $iLength; $i++){
  14. // Het karakter $i binnen $sCode.
  15. $s = $sCode[$i];
  16.  
  17. // Is het een quote die niet gebackslashed is?
  18. if (($s == '"' || $s == "'") && !$bEscape){
  19. if($bQuoteOpen){
  20. //Bij sluiten controleren of het item wel het openingsteken was
  21. //Die bij de opening er was
  22. if($s==$sLast_Quote){
  23. //last_quote weer leegmaken
  24. $sLast_Quote = '';
  25. $aQuote[] = array($s.$sItem.$s, $bQuoteOpen);
  26. // Bool wordt false
  27. $bQuoteOpen = false;
  28. // Leeg de item string weer voor het volgende item.
  29. $sItem = '';
  30. }
  31. }else{
  32. //
  33. $aQuote[] = array($sItem, $bQuoteOpen);
  34. $sLast_Quote = $s;
  35. // Bool wordt true
  36. $bQuoteOpen = true;
  37. // Leeg de item string weer voor het volgende item.
  38. $sItem = '';
  39. }
  40. }
  41. // Is de maximale lengte behaald?
  42. elseif ($i == $iLength - 1){
  43. // Zorg ervoor dat ook de laatste karakter die niet aan $sItem is meegegeven opgeslagen wordt.
  44. $sItem = !empty($sItem) ? $sItem.$s : $s;
  45.  
  46. $aQuote[] = array($sItem, $bQuoteOpen);
  47. }else{
  48. // Is het karkater een escape teken? Controleer wel of er 1 is
  49. if(strlen($sEscape)>0){
  50. if($s == $sEscape){
  51. //kon al geëscaped zijn
  52. $bEscape = $bEscape? False:True;
  53. }
  54. else $bEscape = false;
  55. }
  56. // Voeg de karakter toe aan de item string.
  57. $sItem .= $s;
  58. }
  59. }return $aQuote;
  60. }
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.297s