plugins\search\inc\search.functions.php

Search functions

copyright
(c) Cotonti Team
license
https://github.com/Cotonti/Cotonti/blob/master/License.txt
<?php
/**
 * Search functions
 *
 * @package Search
 * @copyright (c) Cotonti Team
 * @license https://github.com/Cotonti/Cotonti/blob/master/License.txt
 */
 
defined('COT_CODE') || die('Wrong URL.');
 
/**
 * Marks defined words within text
 * @param string $text
 * @param array $words Word list
 * @return string Marked text
 */
function cot_clear_mark($text, $words)
{
	global $cfg;
	$text = trim($text);
	if (!empty($text))
	{
		$text = preg_replace("'\r?\n'", " ", $text);
		$text = preg_replace("'\s+'", " ", $text);
		if (cot_plugin_active('bbcode'))
		{// BB
			$text = preg_replace("'\[img.*?/img\]'si", "", $text);
			$text = preg_replace("'\[thumb.*?/thumb\]'si", "", $text);
			$text = preg_replace("'[[^]]*?.*?]'si", "", $text);
		}
		// HTML
		$text = strip_tags($text);
		$text = htmlspecialchars($text, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);
 
		foreach ($words as $i => $w)
		{
			$p = mb_stripos($text, $w);
			if ($p > 0)
			{
				$p_arr[] = $p;
			}
		}
		if (count($p_arr))
		{
			sort($p_arr);
			$text_result = '';
			$last_pos = -1;
			$delta = 255 / count($p_arr);
			$text_len = mb_strlen($text);
			foreach ($p_arr as $pos_mid)
			{
				$pos_beg = $pos_mid - $delta;
				if ($pos_beg <= 0)
				{
					$pos_beg = 0;
				}
				else
				{
					while($pos_beg > 0 && mb_substr($text, $pos_beg, 1) != " ")
					{
						$pos_beg--;
					}
				}
 
				$pos_end = $pos_mid + $delta;
				if ($pos_end > $text_len)
				{
					$pos_end = $text_len;
				}
				else
				{
					while ($pos_end < $text_len && mb_substr($text, $pos_end, 1) != " ")
					{
						$pos_end++;
					}
				}
				if ($pos_beg <= $last_pos)
				{
					$arOtr[count($arOtr)-1][1] = $pos_end;
				}
				else
				{
					$arOtr[] = array($pos_beg, $pos_end);
				}
				$last_pos = $pos_end;
			}
 
			if (count($arOtr))
			{
				for ($i = 0; $i < count($arOtr); $i++)
				{
					$text_result .= ($arOtr[$i][0] <= 0) ? '' : ' ...';
					$text_result .= mb_substr($text, $arOtr[$i][0], $arOtr[$i][1] - $arOtr[$i][0]);
					$text_result .= ($arOtr[$i][1] >= $text_len) ? '' : ' ... ';
				}
			}
		}
 
		if (mb_strlen($text_result) < 10)
		{
			$len_cut = 255;
			$len_txt = mb_strlen($text);
			$len_cut = ($len_txt < $len_cut) ? $len_txt : $len_cut;
			$text_result = mb_substr($text, 0, $len_cut);
			$text_result = ($len_cut < $len_txt) ? $text_result.'... ' : $text_result;
		}
		$search_tag = array();
		foreach ($words as $k => $i)
		{
			$search_tag[] = preg_quote($i);
		}
		$text_result = preg_replace('`('.implode('|', $search_tag).')`i', '<span class="search_hl">$1</span>', $text_result);
		return ($text_result);
	}
	return ("");
}