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; }
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)); }