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:
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.
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 .
<?php
/*
De functie maakt van een string php code een array met als
items telkens het deel zich binnen quotes bevindt of niet.
$sCode = De string php code. Voorbeeld van hoe je die in een variable kan plaatsen,
zonder gedoe met quotes
$sCode = <<<code
echo "<input type=\"text\" name\"name\">";
code;
*/
function getQuoteArray($sCode, $sEscape = '\\')
{
// De lengte van de code.
$iLength = strlen($sCode);
// Geef de vars met booleans standaard de waarde false.
$bQuoteOpen = $bEscape = false;
$aQuote = array();
$sItem = '';
// Een for loopje om elke karakter binnen $sCode te kunnen krijgen in een aparte var.
for ($i = 0; $i < $iLength; $i++)
{
// Het karakter $i binnen $sCode.
$s = $sCode[$i];
// Is het een quote die niet gebackslashed is?
if (($s == '"' || $s == "'") && !$bEscape)
{
$aQuote[] = array($sItem, $bQuoteOpen);
// Was de boolean true? maak hem dan false en andersom als hij false is dan moet hij true worden.
$bQuoteOpen = $bQuoteOpen ? false : true;
// Leeg de item string weer voor het volgende item.
$sItem = '';
}
// Is de maximale lengte behaald?
else if ($i == $iLength - 1)
{
// Zorg ervoor dat ook de laatste karakter die niet aan $sItem is meegegeven opgeslagen wordt.
$sItem = !empty($sItem) ? $sItem.$s : $s;
$aQuote[] = array($sItem, $bQuoteOpen);
}
else
{
// Is het karkater een escape teken?
$bEscape = $s == $sEscape ? true : false;
// Voeg de karakter toe aan de item string.
$sItem .= $s;
}
}
return $aQuote;
}
?>
<?php
/*
De functie maakt van een string php code een array met als
items telkens het deel zich binnen quotes bevindt of niet.
$sCode = De string php code. Voorbeeld van hoe je die in een variable kan plaatsen,
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?
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...
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.
function getQuoteArray($sCode, $sEscape = '\\'){
// De lengte van de code.
$iLength = strlen($sCode);
// Geef de vars met booleans standaard de waarde false.
$bQuoteOpen = $bEscape = false;
$aQuote = array();
$sItem = $sLast_Quote = '';
// Een for loopje om elke karakter binnen $sCode te kunnen krijgen in een aparte var.
for ($i = 0; $i < $iLength; $i++){
// Het karakter $i binnen $sCode.
$s = $sCode[$i];
// Is het een quote die niet gebackslashed is?
if (($s == '"' || $s == "'") && !$bEscape){
if($bQuoteOpen){
//Bij sluiten controleren of het item wel het openingsteken was
//Die bij de opening er was
if($s==$sLast_Quote){
//last_quote weer leegmaken
$sLast_Quote = '';
$aQuote[] = array($s.$sItem.$s, $bQuoteOpen);
// Bool wordt false
$bQuoteOpen = false;
// Leeg de item string weer voor het volgende item.
$sItem = '';
}
}else{
//
$aQuote[] = array($sItem, $bQuoteOpen);
$sLast_Quote = $s;
// Bool wordt true
$bQuoteOpen = true;
// Leeg de item string weer voor het volgende item.
$sItem = '';
}
}
// Is de maximale lengte behaald?
else if ($i == $iLength - 1){
// Zorg ervoor dat ook de laatste karakter die niet aan $sItem is meegegeven opgeslagen wordt.
$sItem = !empty($sItem) ? $sItem.$s : $s;
$aQuote[] = array($sItem, $bQuoteOpen);
}else{
// Is het karkater een escape teken? Controleer wel of er 1 is
if(strlen($sEscape)>0){
if($s == $sEscape)$bEscape = true;
else $bEscape = false;
}
// Voeg de karakter toe aan de item string.
$sItem .= $s;
}
}return $aQuote;
}
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...
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)
function getQuoteArray($sCode, $sEscape = '\\', $bPHP = true){
// De lengte van de code.
$iLength = strlen($sCode);
// Geef de vars met booleans standaard de waarde false.
$bQuoteOpen = $bEscape = false;
$aQuote = array();
$sItem = $sLast_Quote = '';
// Een for loopje om elke karakter binnen $sCode te kunnen krijgen in een aparte var.
for ($i = 0; $i < $iLength; $i++){
// Het karakter $i binnen $sCode.
$s = $sCode[$i];
// Is het een quote die niet gebackslashed is?
if (($s == '"' || $s == "'") && !$bEscape){
if($bQuoteOpen){
//Bij sluiten controleren of het item wel het openingsteken was
//Die bij de opening er was
if($s==$sLast_Quote){
//last_quote weer leegmaken
$sLast_Quote = '';
$aQuote[] = array($s.$sItem.$s, $bQuoteOpen);
// Bool wordt false
$bQuoteOpen = false;
// Leeg de item string weer voor het volgende item.
$sItem = '';
}
}else{
//
$aQuote[] = array($sItem, $bQuoteOpen);
$sLast_Quote = $s;
// Bool wordt true
$bQuoteOpen = true;
// Leeg de item string weer voor het volgende item.
$sItem = '';
}
}
// Is de maximale lengte behaald?
elseif ($i == $iLength - 1){
// Zorg ervoor dat ook de laatste karakter die niet aan $sItem is meegegeven opgeslagen wordt.
$sItem = !empty($sItem) ? $sItem.$s : $s;
$aQuote[] = array($sItem, $bQuoteOpen);
}else{
// Is het karkater een escape teken? Controleer wel of er 1 is
if(strlen($sEscape)>0){
if($s == $sEscape){
//kon al geëscaped zijn
$bEscape = $bEscape? False:True;
}
else $bEscape = false;
}
// Voeg de karakter toe aan de item string.
$sItem .= $s;
}
}return $aQuote;
}
function getQuoteArray($sCode,$sEscape='\\',$bPHP=true){