php Минивикипедия - ищетизаменяетвтекстетерминынавсплывающиеподсказки

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php Минивикипедия - ищетизаменяетвтекстетерминынавсплывающиеподсказки相关的知识,希望对你有一定的参考价值。

<?php

$this->addTextTerm($item['PREVIEW_TEXT'], $this->allTerms);

// Добавляет термины в текст
public function addTextTerm($text = '', $arTerms = [])
{   
    $numTermsInText = [];
    
    // Перебираем стек терминов и ищем их в тексте расставляя метки
    foreach ($arTerms as $numTerm => $term) {
        $loverText = strtolower($text);
        $found = $this->strposRecursive($text, strtolower($term['NAME']), $numTerm);
        if (!empty($found)) {
            $numTermsInText[] = $numTerm;
        }
    }

    // Заменяем метки на html всплывающей подсказки
    if ($numTermsInText) {
        $n = 1;
        foreach ($numTermsInText as $numTerm) {
            $text = str_replace('##TERM-' . $numTerm . '##', $this->wrapToolTip($n, $arTerms[$numTerm]['DESC']), $text);
            $n++;
        }
    }

    return $text;
}

// Оборачивает текст в разметку и добавляет id
public function wrapToolTip($num = 0, $descTerm)
{
    $wrapTop = '<span class="note"><span class="note__text">[' . $num . ']</span><span class="note__content">';
    $wrapDown = '</span></span>';
    return $wrapTop . $descTerm . $wrapDown;
}

// Рекурсивно пробегает по тексту и находит все вхождения термина, добавляя специальную хеш-метку термина
public function strposRecursive(&$haystack, $needle, $numTerm, $offset = 0, &$results = array()) {
    $offset = mb_strpos(strtolower($haystack), $needle, $offset);
    if ($offset === false) {
        return $results;
    } else {
        $results[] = $offset;
        $length = mb_strlen($needle,'UTF-8');
        $haystack = $this->mbSubstrReplace($haystack, '##TERM-' . $numTerm . '##' , $offset + $length, 0);
        return $this->strposRecursive($haystack, $needle, $numTerm, ($offset + 1), $results);
    }
}

// UTF-8 аналог функции substr_replace
public function mbSubstrReplace($string, $replacement, $start, $length=NULL) 
{
    if (is_array($string)) {
        $num = count($string);
        $replacement = is_array($replacement) ? array_slice($replacement, 0, $num) : array_pad(array($replacement), $num, $replacement);
        
        if (is_array($start)) {
            $start = array_slice($start, 0, $num);
            foreach ($start as $key => $value)
                $start[$key] = is_int($value) ? $value : 0;
        } else {
            $start = array_pad(array($start), $num, $start);
        }

        if (!isset($length)) {
            $length = array_fill(0, $num, 0);
        } elseif (is_array($length)) {
            $length = array_slice($length, 0, $num);
            foreach ($length as $key => $value) {
                $length[$key] = isset($value) ? (is_int($value) ? $value : $num) : 0;
            }
        } else {
            $length = array_pad(array($length), $num, $length);
        }
        return array_map(__FUNCTION__, $string, $replacement, $start, $length);
    }
    
    preg_match_all('/./us', (string)$string, $smatches);
    preg_match_all('/./us', (string)$replacement, $rmatches);
    
    if ($length === NULL) {
        $length = mb_strlen($string);
    }
    
    array_splice($smatches[0], $start, $length, $rmatches[0]);

    return join($smatches[0]);
}

以上是关于php Минивикипедия - ищетизаменяетвтекстетерминынавсплывающиеподсказки的主要内容,如果未能解决你的问题,请参考以下文章

sh Добавитьизменениякпредыдущемукоммиту

html Сендвичменюкнопка,превращаетсявкрестик

text ФункцияMySQLFIND_IN_SETвозвращаетпозициюстрокивспискестрок,разделенныхзапятыми。

php Возвращаетданныеометкахпостов,входящихвуказанную(ые)рубрику(и)

php Возвращаетданныеометкахпостов,входящихвуказанную(ые)рубрику(и)

html Сдвигающийсяпринаведенииэлемент