Пример #1
0
 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));
 }
Пример #2
0
 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();
     }
 }