什么是点(。)应该在MySQL查询中做什么?

时间:2012-03-26 20:17:07

标签: php mysql

我试图找出为什么当我在搜索中输入一个点(。)时,它突出显示搜索结果的每个字符(它将每个字符包裹在<span class="search-highlight"></span>中)并且它也只显示3门票很奇怪,因为它们中至少有一个点:

screenshot

进行实际搜索的查询(以及变量)是:

$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;
        }
    }

有谁知道为什么或如何使用简单的点(。)会导致这种情况,是否可以修复?

感谢您提前提供任何帮助。

5 个答案:

答案 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作为与每个单个字符匹配的表达式部分。