protected function _testgetTagTextRegexPositions(Regex $oRegex) { $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()); // Longueur des chaînes de texte précédents $iPrevTextsLength = 0; // Pour chaque Tag/Text foreach ($aTagTextPositions['tag_text_pos'] as $iIndex => $aTagTextPos) { // S'il l'élément est un texte if ($aTagTextPos['type'] == 'text') { // On l'explose par rapport à la regex, en récupérant les positions $aPlainTexts = $oRegex->split($aTagTextPos['element'], -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY | PREG_SPLIT_OFFSET_CAPTURE); // 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->_oString->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->_oWordRegex->test($aPlainText[0]); // On alimente le tableau des positions... $aRegexPositions[$iIndex][$iPlainTextIndex] = array('element' => $aPlainText[0], 'match_regex' => $bMatchRegex, 'length' => $iLength, 'pos' => array('string' => $this->_textPosToStringPos($aTagTextPositions['tag_text_pos'], $iStartTextPos, $iEndTextPos), 'text' => array($iStartTextPos, $iEndTextPos))); // ... et le tableau des stats $aStats[($bMatchRegex ? '' : 'no_') . 'matching_regex_indexes'][] = array('index' => $iIndex, 'chunk_index' => $iPlainTextIndex); } $iPrevTextsLength += $iCurrentTextLength; } } return array('tag_text' => $aTagTextPositions['tag_text'], 'tag_text_pos' => $aTagTextPositions['tag_text_pos'], 'regex_pos' => $aRegexPositions, 'stats' => $aTagTextPositions['stats'] + array('regex_pos' => $aStats)); }
protected function _buildRegexPos() { // Positions des éléments répartis par l'expression rationnelle $this->_aRegexPos = array(); if ($this->_getHTMLParsingMode() !== String::CHUNK_PARSING) { // Texte nettoyé de ses balises if ($this->_getStringType() === InterfaceText::HTML) { $oRegexTag = Regex::tag()->setModifiers($this->_m()); $sPlainText = $oRegexTag->replace($this->_getString()->get(), ''); } else { $sPlainText = $this->_getString()->get(); } // On explose le texte plain selon l'expression rationnelle $aPlainTexts = array_values($this->_getRegex()->split($sPlainText, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_OFFSET_CAPTURE)); // On alimente le tableau des positions de la regex dans le texte $this->_feedRegexPosArray($aPlainTexts); } else { // Récupération des positions des éléments séparés (balises html et textes plain) $aTagTextPositions = $this->getTagTextPos(); // Longueur des chaînes de texte précédents $iPrevTextsLength = 0; // Pour chaque Tag/Text foreach ($aTagTextPositions as $aTagTextPos) { // S'il l'élément est un texte if ($aTagTextPos['type'] == 'text') { // On l'explose par rapport à la regex, en récupérant les positions $aPlainTexts = $this->_oRegex->split($aTagTextPos['element'], -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY | PREG_SPLIT_OFFSET_CAPTURE); // On alimente le tableau des positions de la regex dans le texte $iCurrentTextLength = $this->_feedRegexPosArray($aPlainTexts, $iPrevTextsLength); $iPrevTextsLength += $iCurrentTextLength; } } } $iMatchingRegexIndex = $iNoMatchingRegexIndex = 0; foreach ($this->_aRegexPos as $iRegexPosIndex => $aRegexPos) { foreach ($aRegexPos['pos']['string'] as $aPos) { if ($aRegexPos['match_regex']) { $this->_aStats['index']['matching_regex_elem'][$iMatchingRegexIndex] += array('regex_pos' => $iRegexPosIndex); ++$iMatchingRegexIndex; } else { $this->_aStats['index']['no_matching_regex_elem'][$iNoMatchingRegexIndex] += array('regex_pos' => $iRegexPosIndex); ++$iNoMatchingRegexIndex; } } } // Si on n'est pas en chunk // et que le regex_pos précédent est égale au regex_pos actuel // on fusionne les 2, ainsi : /* [0] => Array ( [tag_text_pos] => 0 [chunk_pos] => [regex_pos] => 0 ) [1] => Array ( [tag_text_pos] => 2 [chunk_pos] => [regex_pos] => 0 ) */ // devient /* [0] => Array ( [tag_text_pos] => array(0, 2) [chunk_pos] => [regex_pos] => 0 ) */ if ($this->_getHTMLParsingMode() !== String::CHUNK_PARSING) { $this->_groupStatRegexByRegexPos(); } }