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 Сдвигающийсяпринаведенииэлемент