@groovie

Как сделать поиск по точному вхождению поискового слова?

Есть такой фильтр для cms DLE, код ниже в спойлере. Если ввести в поиске слово "Работа", он находит все новости, в которых это слово встречается. Например: "работа", "работа на дому", "работа по найму" - из всех этих он должен найти только то, у которого лишь точное слово поиска "работа" без всяких "работа на дому" и так далее. Либо если вписали в поиск "работа на дому" должен искать только это.
spoiler
<?php

if( !defined( 'DATALIFEENGINE' )) return;

if(!$form_field_arr)
{
	$form_field = $db->safesql(trim( $_REQUEST['form_field'] ));
	if(substr($form_field, -1) == "/")
		$form_field = substr($form_field, 0, -1);
	$form_field = explode("/page/", $form_field);
	$form_field = explode("/", $form_field[0]);
	$form_field_arr = array();
	foreach($form_field as $val)
	{
		$val_arr = explode("=", $val);
		if($val_arr[1] != "")
		{
			if(array_key_exists($val_arr[0], $form_field_arr))
				$form_field_arr[$val_arr[0]] .= "," . $val_arr[1];
			else
				$form_field_arr[$val_arr[0]] = $val_arr[1];
		}
	}
}
$delete_array_keys = array
(
	"date" 		=> "1970-01-01",
	"do"		=> "",
	"cstart"	=> "0",
	"cat"		=> "",
	"sort"		=> "",
	"order"		=> "",
	"order_by" 	=> "",
	"tsn"		=> "",
);

$xf_filter_arr = array();
$where = array();

$xfield_data = array_diff_key($form_field_arr, $delete_array_keys);

foreach($xfield_data as $key => &$value)
{
	if(count(explode(",", $value)) > 1)
		$value = explode(",", $value);
	if($value != NULL && $value != "" && is_array($value))
	{
		if(substr_count( $key, 'l.'))
		{
			$key = str_replace("l.", "", $key);
			foreach($value as $index => &$val)
			{
				$val = $db->safesql($val);
				$key = $db->safesql($key);
				$like_filter_arr[$key][] = "{$key} LIKE '%{$val}%'";
			}
			$where_like_arr[] =  "(" . implode(' OR ', $like_filter_arr[$key]) . ")";
		}
		elseif(substr_count( $key, 'm.'))
		{
			$key = str_replace("m.", "", $key);
			$val = $db->safesql(implode("|", $value));
			$key = $db->safesql($key);
			$match_filter_arr[$key][] = "{$key} REGEXP '[[:<:]](". $val .")[[:>:]]'";
			$where_match_arr[] =  "(" . implode(' OR ', $match_filter_arr[$key]) . ")";
		}
		elseif(substr_count( $key, 's.'))
		{
			$key = str_replace("s.", "", $key);
			foreach($value as $index => &$val)
			{
				$val = $db->safesql($val);
				$key = $db->safesql($key);
				$pe_filter_arr[$key][] = "SUBSTRING_INDEX( SUBSTRING_INDEX( xfields,  '{$key}|', -1 ) ,  '||', 1 ) = '{$val}'";
			}
			$where_pe_arr[] =  "(" . implode(' OR ', $pe_filter_arr[$key]) . ")";
		}
		else
		{
			foreach($value as $index => &$val)
			{
				$val = $db->safesql($val);
				$key = $db->safesql($key);
				$xf_filter_arr[$key][] = "SUBSTRING_INDEX( SUBSTRING_INDEX( xfields,  '{$key}|', -1 ) ,  '||', 1 ) LIKE '%{$val}%'";
			}
			$where_xf_arr[] =  "(" . implode(' OR ', $xf_filter_arr[$key]) . ")";
		}
	}
	elseif($value != NULL && $value != "" && !is_array($value))
	{
		if(substr_count( $key, 'r-' ) > 0)
		{
			$name_xf = str_replace('r-', '', $key);
			$name_xf = $db->safesql($name_xf);
			$value = explode( ";", $value);
			$value[1] = $db->safesql($value[1]);
			$value[0] = $db->safesql($value[0]);
			$where_from[] = "SUBSTRING_INDEX( SUBSTRING_INDEX( xfields,  '{$name_xf}|', -1 ) ,  '||', 1 )>=$value[0] AND SUBSTRING_INDEX( SUBSTRING_INDEX( xfields,  '{$name_xf}|', -1 ) ,  '||', 1 )<=$value[1]";
		}
		elseif(substr_count( $key, 'from-' ) > 0)
		{
			$name_xf = str_replace('from-', '', $key);
			$name_xf = $db->safesql($name_xf);
			$value = $db->safesql($value);
			$where_from[] = "SUBSTRING_INDEX( SUBSTRING_INDEX( xfields,  '{$name_xf}|', -1 ) ,  '||', 1 )>=$value";
		}
		elseif(substr_count( $key, 'to-' ) > 0)
		{
			$name_xf = str_replace('to-', '', $key);
			$name_xf = $db->safesql($name_xf);
			$value = $db->safesql($value);
			$where_from[] = "SUBSTRING_INDEX( SUBSTRING_INDEX( xfields,  '{$name_xf}|', -1 ) ,  '||', 1 )<=$value";
		}
		elseif(substr_count( $key, 'l.' ) > 0)
		{
			$key = $db->safesql(str_replace("l.","",$key));
			$value = $db->safesql($value);
			$where_from[] = "{$key} LIKE '%{$value}%'";
		}
		elseif(substr_count( $key, 'm.' ) > 0)
		{
			$key = $db->safesql(str_replace("m.","",$key));
			$value = $db->safesql($value);
			$where_from[] = "{$key} REGEXP '[[:<:]](". str_replace(',', '|', $value) .")[[:>:]]'";
		}
		elseif(substr_count( $key, 's.' ) > 0)
		{
			$key = str_replace("s.", "", $key);
			$key = $db->safesql($key);
			$value = $db->safesql($value);
			$where_from[] = "SUBSTRING_INDEX( SUBSTRING_INDEX( xfields,  '{$key}|', -1 ) ,  '||', 1 ) = '{$value}'";
		}
		else
		{
			$key = $db->safesql($key);
			$value = $db->safesql($value);
			$where[] = "SUBSTRING_INDEX( SUBSTRING_INDEX( xfields,  '{$key}|', -1 ) ,  '||', 1 ) LIKE '%{$value}%'";
		}
	}
}
if($where_from)
{
	$where_from = implode( " AND ", $where_from);
	$where[] = $where_from;
}

if($where_xf_arr)
{
	$where_xf_arr = implode( " AND ", $where_xf_arr);
	$where[] = $where_xf_arr;
}

if($where_pe_arr)
{
	$where_pe_arr = implode( " AND ", $where_pe_arr);
	$where[] = $where_pe_arr;
}

if($where_like_arr)
{
	$where_like_arr = implode( " AND ", $where_like_arr);
	$where[] = $where_like_arr;
}

if($where_match_arr)
{
	$where_match_arr = implode( " AND ", $where_match_arr);
	$where[] = $where_match_arr;
}

if ( $_REQUEST['cstart'] > 0)
{
	$cstart = intval($_REQUEST['cstart']);
	$cstart = $cstart - 1;
	$cstart = $cstart * $config['news_number'];
}
else
{
	if($filter_nav)
	{
		$cstart = $page_ajax - 1;
		$cstart = $cstart * $config['news_number'];
	}
	else
		$cstart = 0;
}

$sortby_arr = array(
	"date",
	"title",
	"comm_num",
	"news_read",
	"autor",
	"category",
	"rating"
);

$order_by = $form_field_arr["order_by"];
$order = $form_field_arr["order"];
if($order_by)
{
	if(in_array($order_by, $sortby_arr))
		$order_by = " ORDER BY  " . $db->safesql($order_by);
	else
		$order_by = " ORDER BY SUBSTRING_INDEX( SUBSTRING_INDEX( xfields,  '{$order_by}|', -1 ) ,  '||', 1 ) ";
	if(($order == "desc" || $order == "asc") && $order_by)
		$order_by .= " " . $order;
}
$cat = $form_field_arr["cat"];
if($cat)
{
	$cat = explode(",", $cat);
	foreach($cat as $key => $value)
		$cats[] = $db->safesql($value);
	$allow_category = ($config['version_id'] >= '10.2') ? $config['allow_multi_category'] == '1' : $config['allow_multi_category'] == "yes";
	if( $allow_category ) 	$where[] = "category REGEXP '[[:<:]](" . implode("|", $cats) . ")[[:>:]]'";
	else 					$where[] = "category IN ('" . implode(",", $cats) . "')";
}
if(count($where))
	$where = " AND " . implode(" AND ", $where);
else
	$where = "";

$sql_count = "SELECT COUNT(*) as count FROM " . PREFIX . "_post p LEFT JOIN " . PREFIX . "_post_extras e ON (p.id=e.news_id) WHERE approve=1" . $where;

if($order_by)
	$where .= $order_by;

$where .= " LIMIT {$cstart},{$config[news_number]}";
$sql_select = "SELECT p.id, p.autor, p.date, p.short_story, p.full_story as full_story, p.xfields, p.title, p.category, p.alt_name, p.comm_num, p.allow_comm, p.fixed, p.tags, e.news_read, e.allow_rate, e.rating, e.vote_num, e.votes, e.view_edit, e.editdate, e.editor, e.reason FROM " . PREFIX . "_post p LEFT JOIN " . PREFIX . "_post_extras e ON (p.id=e.news_id) WHERE approve=1 {$where}";

$allow_active_news = TRUE;
$category_id = true;
$req_to_page = array();
foreach($form_field_arr as $key => $val)
	$req_to_page[] = $key . "=" . $val;
$req_to_page = implode("/", $req_to_page);
if($cstart == 0)
	$url_page = $config['http_home_url'] . "f/" . $req_to_page;
else
{
	$url_page = explode("/page", $req_to_page);
	$url_page = $config['http_home_url'] . "f/" . $url_page[0];
}
$nav_set = true;
$back_cat_info = $cat_info[$category_id]['short_tpl'];
if(isset($form_field_arr["tsn"]) && !is_null($form_field_arr["tsn"]))
	$cat_info[$category_id]['short_tpl'] = "field_search/{$form_field_arr[tsn]}";
else
	$cat_info[$category_id]['short_tpl'] = "field_search/field_search_news";
include ENGINE_DIR . '/modules/show.short.php';
$cat_info[$category_id]['short_tpl'] = $back_cat_info;
?>

Я так думаю за это отвечает данный код:
if( $allow_category ) 	$where[] = "category REGEXP '[[:<:]](" . implode("|", $cats) . ")[[:>:]]'";
	else 					$where[] = "category IN ('" . implode(",", $cats) . "')";
  • Вопрос задан
  • 57 просмотров
Решения вопроса 1
2ord
@2ord
продвинутый чайник
Например: "работа", "работа на дому", "работа по найму" - из всех этих он должен найти только то, у которого лишь точное слово поиска "работа" без всяких "работа на дому" и так далее.

WHERE category='работа'
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы
Badoo Development Москва
от 140 000 до 180 000 руб.
Badoo Development Москва
от 180 000 до 250 000 руб.
4px Москва
от 100 000 до 150 000 руб.