function tbs_Locator_PrmRead(&$Txt,$Pos,$HtmlTag,$DelimChrs,$BegStr,$EndStr,&$Loc,&$PosEnd) { // À mettre dans la classe TBS $BegLen = strlen($BegStr); $BegChr = $BegStr[0]; $BegIs1 = ($BegLen===1); $DelimIdx = false; $DelimCnt = 0; $DelimChr = ''; $BegCnt = 0; $SubName = $Loc->SubOk; $Status = 0; // 0: name not started, 1: name started, 2: name ended, 3: equal found, 4: value started $PosName = 0; $PosNend = 0; $PosVal = 0; // Paramètres de vérif de la boucle $PosEnd = strpos($Txt,$EndStr,$Pos); if ($PosEnd===false) return; $Continue = ($Pos<$PosEnd); while ($Continue) { $Chr = $Txt[$Pos]; if ($DelimIdx) { // Lecture dans une chaîne if ($Chr===$DelimChr) { // Quote rencontré if ($Chr===$Txt[$Pos+1]) { // Double quote => la chaîne continue en dédoublant le quote $Pos++; } else { // Simple quote => fin de la chaîne $DelimIdx = false; } } } else { // Lecture hors chaîne if ($BegCnt===0) { // Analyse des paramètre $CheckChr = false; if ($Chr===' ') { if ($Status===1) { $Status = 2; $PosNend = $Pos; } elseif ($HtmlTag and ($Status===4)) { tbs_Locator_PrmCompute($Txt,$Loc,$SubName,$Status,$HtmlTag,$DelimChr,$DelimCnt,$PosName,$PosNend,$PosVal,$Pos); $Status = 0; } } elseif (($HtmlTag===false) and ($Chr===';')) { tbs_Locator_PrmCompute($Txt,$Loc,$SubName,$Status,$HtmlTag,$DelimChr,$DelimCnt,$PosName,$PosNend,$PosVal,$Pos); $Status = 0; } elseif ($Status===4) { $CheckChr = true; } elseif ($Status===3) { $Status = 4; $DelimCnt = 0; $PosVal = $Pos; $CheckChr = true; } elseif ($Status===2) { if ($Chr==='=') { $Status = 3; } elseif ($HtmlTag) { tbs_Locator_PrmCompute($Txt,$Loc,$SubName,$Status,$HtmlTag,$DelimChr,$DelimCnt,$PosName,$PosNend,$PosVal,$Pos); $Status = 1; $PosName = $Pos; $CheckChr = true; } else { $Status = 4; $DelimCnt = 0; $PosVal = $Pos; $CheckChr = true; } } elseif ($Status===1) { if ($Chr==='=') { $Status = 3; $PosNend = $Pos; } else { $CheckChr = true; } } else { $Status = 1; $PosName = $Pos; $CheckChr = true; } if ($CheckChr) { $DelimIdx = strpos($DelimChrs,$Chr); if ($DelimIdx===false) { if ($Chr===$BegChr) { if ($BegIs1) { $BegCnt++; } elseif(substr($Txt,$Pos,$BegLen)===$BegStr) { $BegCnt++; } } } else { $DelimChr = $DelimChrs[$DelimIdx]; $DelimCnt++; $DelimIdx = true; } } } } // Charactère suivant $Pos++; // On vérifie si c'est la fin if ($Pos===$PosEnd) { if ($DelimIdx===false) { if ($BegCnt>0) { $BegCnt--; } else { $Continue = false; } } if ($Continue) { $PosEnd = strpos($Txt,$EndStr,$PosEnd+1); if ($PosEnd===false) return; } else { tbs_Locator_PrmCompute($Txt,$Loc,$SubName,$Status,$HtmlTag,$DelimChr,$DelimCnt,$PosName,$PosNend,$PosVal,$Pos); } } } $PosEnd = $PosEnd + (strlen($EndStr)-1); }
function tbs_Locator_PrmRead(&$Txt, $Pos, $HtmlTag, $DelimChrs, $BegStr, $EndStr, &$Loc, &$PosEnd) { $BegLen = strlen($BegStr); $BegChr = $BegStr[0]; $BegIs1 = $BegLen === 1; $DelimIdx = false; $DelimCnt = 0; $DelimChr = ''; $BegCnt = 0; $SubName = $Loc->SubOk; $Status = 0; // 0: name not started, 1: name started, 2: name ended, 3: equal found, 4: value started $PosName = 0; $PosNend = 0; $PosVal = 0; // Variables for checking the loop $PosEnd = strpos($Txt, $EndStr, $Pos); if ($PosEnd === false) { return; } $Continue = $Pos < $PosEnd; while ($Continue) { $Chr = $Txt[$Pos]; if ($DelimIdx) { // Reading in the string if ($Chr === $DelimChr) { // Quote found if ($Chr === $Txt[$Pos + 1]) { // Double Quote => the string continue with un-double the quote $Pos++; } else { // Simple Suote => end of string $DelimIdx = false; } } } else { // Reading outside the string if ($BegCnt === 0) { // Analyzing parameters $CheckChr = false; if ($Chr === ' ' or $Chr === "\r" or $Chr === "\n") { if ($Status === 1) { $Status = 2; $PosNend = $Pos; } elseif ($HtmlTag and $Status === 4) { tbs_Locator_PrmCompute($Txt, $Loc, $SubName, $Status, $HtmlTag, $DelimChr, $DelimCnt, $PosName, $PosNend, $PosVal, $Pos); $Status = 0; } } elseif ($HtmlTag === false and $Chr === ';') { tbs_Locator_PrmCompute($Txt, $Loc, $SubName, $Status, $HtmlTag, $DelimChr, $DelimCnt, $PosName, $PosNend, $PosVal, $Pos); $Status = 0; } elseif ($Status === 4) { $CheckChr = true; } elseif ($Status === 3) { $Status = 4; $DelimCnt = 0; $PosVal = $Pos; $CheckChr = true; } elseif ($Status === 2) { if ($Chr === '=') { $Status = 3; } elseif ($HtmlTag) { tbs_Locator_PrmCompute($Txt, $Loc, $SubName, $Status, $HtmlTag, $DelimChr, $DelimCnt, $PosName, $PosNend, $PosVal, $Pos); $Status = 1; $PosName = $Pos; $CheckChr = true; } else { $Status = 4; $DelimCnt = 0; $PosVal = $Pos; $CheckChr = true; } } elseif ($Status === 1) { if ($Chr === '=') { $Status = 3; $PosNend = $Pos; } else { $CheckChr = true; } } else { $Status = 1; $PosName = $Pos; $CheckChr = true; } if ($CheckChr) { $DelimIdx = strpos($DelimChrs, $Chr); if ($DelimIdx === false) { if ($Chr === $BegChr) { if ($BegIs1) { $BegCnt++; } elseif (substr($Txt, $Pos, $BegLen) === $BegStr) { $BegCnt++; } } } else { $DelimChr = $DelimChrs[$DelimIdx]; $DelimCnt++; $DelimIdx = true; } } } else { if ($Chr === $BegChr) { if ($BegIs1) { $BegCnt++; } elseif (substr($Txt, $Pos, $BegLen) === $BegStr) { $BegCnt++; } } } } // Next char $Pos++; // We check if it's the end if ($Pos === $PosEnd) { if ($DelimIdx === false) { if ($BegCnt > 0) { $BegCnt--; } else { $Continue = false; } } if ($Continue) { $PosEnd = strpos($Txt, $EndStr, $PosEnd + 1); if ($PosEnd === false) { return; } } else { tbs_Locator_PrmCompute($Txt, $Loc, $SubName, $Status, $HtmlTag, $DelimChr, $DelimCnt, $PosName, $PosNend, $PosVal, $Pos); } } } $PosEnd = $PosEnd + (strlen($EndStr) - 1); }