我试图找出为什么当我在搜索中输入一个点(。)时,它突出显示搜索结果的每个字符(它将每个字符包裹在<span class="search-highlight"></span>
中)并且它也只显示3门票很奇怪,因为它们中至少有一个点:
进行实际搜索的查询(以及变量)是:
$q = mysql_real_escape_string($_GET['q']);
$query = trim(strtoupper($q));
$query = htmlentities($query, ENT_QUOTES, "UTF-8");
$construct = $is_employee==false ? "user='$userid' AND" : "";
$tickets_result = mysql_query("SELECT `id`, `subject`, `message`, `timestamp`, `user` FROM `tickets` WHERE $construct (upper(subject) LIKE '%".$query."%' OR upper(message) LIKE '%".$query."%')") or trigger_error(mysql_error());
我的highlight
课程:
class highlight
{
public $output_text;
function __construct($text, $words) {
$split_words = explode(" ", $words);
foreach ($split_words as $word) {
$text = preg_replace("|($word)|Ui",
"<span class=\"search-highlight\">$1</span>",
$text);
}
$this->output_text = $text;
}
}
有谁知道为什么或如何使用简单的点(。)会导致这种情况,是否可以修复?
感谢您提前提供任何帮助。
答案 0 :(得分:4)
这里的preg_replace
是“有问题”。 .
是一个通配符,因此它匹配任何内容。
在将输入字符串放入正则表达式之前,您可能希望在输入字符串上运行preg_quote
。
答案 1 :(得分:3)
只需在此处添加转义正则表达式搜索的替代方法:
也许您想要的是非正则表达式替换?
http://us3.php.net/str_replace
str_replace - 将所有出现的搜索字符串替换为 替换字符串
对于完全匹配,这对我来说最有意义......
答案 2 :(得分:2)
您正在使用preg_replace这是一个正则表达式搜索。
。在正则表达式中匹配任何字符。实际上与MySQL无关。
答案 3 :(得分:1)
.
(点)在正则表达式中具有特殊含义 - 它匹配每个字符 - 这就是整个数据突出显示的原因。你应该使用转义并搜索\.
而不只是一个点。
答案 4 :(得分:1)
对用户的输入使用http://www.php.net/manual/pl/function.preg-quote.php,coz preg_replace将dot作为与每个单个字符匹配的表达式部分。