protected function _feedRegexPosArray($aPlainTexts, $iPrevTextsLength = 0)
 {
     // Taille du texte en cours
     $iCurrentTextLength = 0;
     // Pour chaque élément du texte explosé
     foreach ($aPlainTexts as $iPlainTextIndex => $aPlainText) {
         // On récupère son nombre de caractères
         $iLength = mb_strlen($aPlainText[0], $this->_getString()->getEncoding());
         // Le nombre de caractères de ce morceau de texte explosé vient grossir le nombre
         // de caractères du texte
         $iCurrentTextLength += $iLength;
         // On additionne à la position de début du texte, la longueur des textes précédents
         $iStartTextPos = $iPrevTextsLength + $aPlainText[1];
         $iEndTextPos = $iStartTextPos + $iLength;
         $bMatchRegex = $this->_oRegex->test($aPlainText[0]);
         $aStringPos = $this->textPosToStringPos($iStartTextPos, $iEndTextPos);
         $mChunkPos = $this->_cHTMLParsingMode === String::CHUNK_PARSING ? $iPlainTextIndex : null;
         foreach ($aStringPos as &$aStringP) {
             $aStringP['index']['chunk_pos'] = $mChunkPos;
             $this->_aStats['index'][($bMatchRegex ? '' : 'no_') . 'matching_regex_elem'][] = array('tag_text_pos' => array($aStringP['index']['tag_text_pos']), 'chunk_pos' => $mChunkPos);
         }
         // On alimente le tableau des positions...
         $this->_aRegexPos[] = array('element' => $aPlainText[0], 'match_regex' => $bMatchRegex, 'length' => $iLength, 'pos' => array('string' => $aStringPos, 'text' => array('start' => $iStartTextPos, 'end' => $iEndTextPos)));
     }
     return $iCurrentTextLength;
 }
Beispiel #2
0
 protected function _getTagTextRegexPositions(Regex $oRegex)
 {
     // Texte nettoyé de ses balises
     if ($this->_oString->getType() === InterfaceText::HTML) {
         $oRegexTag = Regex::tag()->setModifiers($this->_m());
         $sPlainText = $oRegexTag->replace($this->_oString->get(), '');
     } else {
         $sPlainText = $this->_oString->get();
     }
     // On explose le texte plain selon l'expression rationnelle
     $aPlainTexts = array_values($oRegex->split($sPlainText, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_OFFSET_CAPTURE));
     // Récupération des positions des éléments séparés (balises html et textes plain)
     $aTagTextPositions = $this->_getTagTextPositions();
     // Positions des éléments répartis par l'expression rationnelle
     $aRegexPositions = array();
     $aStats = array('matching_regex_indexes' => array(), 'no_matching_regex_indexes' => array());
     // Pour chaque texte plain
     foreach ($aPlainTexts as $iIndex => $aPlainText) {
         // On récupère son nombre de caractères
         $iLength = mb_strlen($aPlainText[0], $this->_oString->getEncoding());
         $bMatchRegex = $oRegex->test($aPlainText[0]);
         // On alimente le tableau des positions...
         $aRegexPositions[$iIndex] = array('element' => $aPlainText[0], 'match_regex' => $bMatchRegex, 'length' => $iLength, 'pos' => array('string' => $this->_textPosToStringPos($aTagTextPositions['tag_text_pos'], $aPlainText[1], $aPlainText[1] + $iLength), 'text' => array($aPlainText[1], $aPlainText[1] + $iLength)));
         // ... et le tableau des stats
         $aStats[($bMatchRegex ? '' : 'no_') . 'matching_regex_indexes'][] = $iIndex;
     }
     return array('tag_text' => $aTagTextPositions['tag_text'], 'tag_text_pos' => $aTagTextPositions['tag_text_pos'], 'regex_pos' => $aRegexPositions, 'stats' => $aTagTextPositions['stats'] + array('regex_pos' => $aStats));
 }