比如 一个文章标题为  要求输入‘服装合同’就能搜索到

解决方案 »

  1.   

    WHERE title like '%服装合同%'
      

  2.   

    那要看你的存储结构,如果是数据库,可以用like语句来模糊匹配
    如果是XML,可以用正则来模糊匹配
      

  3.   

    [Quote=引用 1 楼 jzh2004 的回复:]
    WHERE title like '%服装合同%'
    [/Quot
    这样不行, 服装合同连在一起了
      

  4.   

    WHERE title like '%服装%' AND title like '%合同%'
      

  5.   

    急急急 PHP正则怎么匹配中文 把 服装合同 分开
      

  6.   


    你不用查数据库吗?查的话就是这样模糊查询的条件,如果像2楼说的是从XML里取,那么才需要正则
      

  7.   

    中文分词
    http://www.ftphp.com/scws/
      

  8.   


    好的,谢谢。邮箱[email protected]
      

  9.   

    直接发这里给你吧,顺便分享下!<?php
    /**
     *
     * <p>对传入的内容进行分词utf-8编码</p>
     * @author yichen
     * @version 1.0 2010-11-09
     *
     */
     class Detach{
        public static function dualDecom($str)
        {
            preg_match_all("/[a-zA-z0-9]+/",$str,$eg);//英文单独分离出来
            //所有汉字后添加ASCII的0字符,此法是为了排除特殊中文拆分错误的问题
            $str = preg_replace("/[\x80-\xff]{3}/","\\0".chr(0x00),$str);
            //拆分的分割符
            $search = array(",", "/", "\\", ".", ";", ":", "\"", "!", "~", "`", "^", "(", ")", "?", "-", "\t", "\n", "'", "<", ">", "\r", "\r\n","$", "&", "%", "#", "@", "+", "=", "{", "}", "[", "]", ":", ")", "(", ".", "。", ",", "!", ";", "“", "”", "‘", "’", "[", "]", "、", "—", " ", "《", "》", "-", "…", "【", "】",);
            //替换所有的分割符为空格
            $str = str_replace($search,' ',$str);
            //用正则匹配半角单个字符或者全角单个字符,存入数组$ar
            preg_match_all("/[\x80-\xff]+?\\x00/",$str,$ar);
            $ar = $ar[0];
            //去掉$ar中ASCII为0字符的项目
            for ( $i = 0; $i < count($ar); $i++ )
            if ($ar[$i] != chr(0x00)) $ar_new[]=$ar[$i];
            $ar = $ar_new;
            unset($ar_new);
            $oldsw = 0;
            //把连续的半角存成一个数组下标,或者全角的每2个字符存成一个数组的下标
            for ( $ar_str = '', $i = 0; $i < count($ar); $i++)
            {
            $sw=strlen($ar[$i]);
                 if ( $i > 0 and $sw != $oldsw) $ar_str.=" ";
                 if ( $sw == 1 ){
                    $ar_str.= $ar[$i];
                 }else{
                    if ( strlen($ar[$i+1]) >= 2 ){
                        $ar_str.= $ar[$i].$ar[$i+1].' ';
                        if(strlen($ar[$i+2]) >= 2){
                            $ar_str.= $ar[$i].$ar[$i+1].$ar[$i+2].' ';
                            if(strlen($ar[$i+3]) >= 2){
                                $ar_str.= $ar[$i].$ar[$i+1].$ar[$i+2].$ar[$i+3].' ';
                                if(strlen($ar[$i+4]) >= 2){
                                    $ar_str.= $ar[$i].$ar[$i+1].$ar[$i+2].$ar[$i+3].$ar[$i+4].' ';
                                    if(strlen($ar[$i+5]) >= 2){
                                        $ar_str.= $ar[$i].$ar[$i+1].$ar[$i+2].$ar[$i+3].$ar[$i+4].$ar[$i+5].' ';
                                        if(strlen($ar[$i+6]) >= 2){$ar_str.= $ar[$i].$ar[$i+1].$ar[$i+2].$ar[$i+3].$ar[$i+4].$ar[$i+5].$ar[$i+6].' ';}
                                    }
                                }
                            }
                        } 
                    }elseif ( $oldsw == 1 OR $oldsw == 0 ){
                        $ar_str.= $ar[$i];
                    }
                    $oldsw=$sw;
                 }
            
            
            }
            //去掉连续的空格
            $ar_str = trim(preg_replace("# {1,}#i"," ",$ar_str));
            $ar_str = preg_replace("/[^\s\x{4e00}-\x{9fa5}]/u",'',$ar_str);
            $rst =  explode(' ',$ar_str);
            if(!empty($eg)){
                foreach($eg[0] as $val){$rst[count($rst)] = $val;}
            }
            return $rst;
        }
    }
    ?>
    返回的是按2个,3个,4个,5个,6个,7个汉字进行组合的词的数组!!
    你把结果print_r出来就知道了!你可以根据自己的需求修改里面的拆分规则!
    然后再到你的库里去模糊搜索,得出你要的结果!
      

  10.   

    $dt = new Detach();
    $a = $dt->dualDecom('中文字符');
    print_r($a);输出结果
    Array ( [0] => )
      

  11.   

    那就麻烦了 你要中文分词 ~~
    不过呢,你可以搜索一下 solr 。一个很好的搜索引擎
      

  12.   

    <?php
    /**
     *
     * <p>对传入的内容进行分词utf-8编码</p>
     * @author yichen
     * @version 1.0 2010-11-09
     *
     */
     class Detach{
        public static function dualDecom($str)
        {
            preg_match_all("/[a-zA-z0-9]+/",$str,$eg);//英文单独分离出来
            //所有汉字后添加ASCII的0字符,此法是为了排除特殊中文拆分错误的问题
            $str = preg_replace("/[\x80-\xff]{3}/","\\0".chr(0x00),$str);
            //拆分的分割符
            $search = array(",", "/", "\\", ".", ";", ":", "\"", "!", "~", "`", "^", "(", ")", "?", "-", "\t", "\n", "'", "<", ">", "\r", "\r\n","$", "&", "%", "#", "@", "+", "=", "{", "}", "[", "]", ":", ")", "(", ".", "。", ",", "!", ";", "“", "”", "‘", "’", "[", "]", "、", "—", " ", "《", "》", "-", "…", "【", "】",);
            //替换所有的分割符为空格
            $str = str_replace($search,' ',$str);
            //用正则匹配半角单个字符或者全角单个字符,存入数组$ar
            preg_match_all("/[\x80-\xff]+?\\x00/",$str,$ar);
            $ar = $ar[0];
            //去掉$ar中ASCII为0字符的项目
            for ( $i = 0; $i < count($ar); $i++ )
            if ($ar[$i] != chr(0x00)) $ar_new[]=$ar[$i];
            $ar = $ar_new;
            unset($ar_new);
            $oldsw = 0;
            //把连续的半角存成一个数组下标,或者全角的每2个字符存成一个数组的下标
            for ( $ar_str = '', $i = 0; $i < count($ar); $i++)
            {
            $sw=strlen($ar[$i]);
                 if ( $i > 0 and $sw != $oldsw) $ar_str.=" ";
                 if ( $sw == 1 ){
                    $ar_str.= $ar[$i];
                 }else{
                    if ( strlen($ar[$i+1]) >= 2 ){
                        $ar_str.= $ar[$i].$ar[$i+1].' ';
                        if(strlen($ar[$i+2]) >= 2){
                            $ar_str.= $ar[$i].$ar[$i+1].$ar[$i+2].' ';
                            if(strlen($ar[$i+3]) >= 2){
                                $ar_str.= $ar[$i].$ar[$i+1].$ar[$i+2].$ar[$i+3].' ';
                                if(strlen($ar[$i+4]) >= 2){
                                    $ar_str.= $ar[$i].$ar[$i+1].$ar[$i+2].$ar[$i+3].$ar[$i+4].' ';
                                    if(strlen($ar[$i+5]) >= 2){
                                        $ar_str.= $ar[$i].$ar[$i+1].$ar[$i+2].$ar[$i+3].$ar[$i+4].$ar[$i+5].' ';
                                        if(strlen($ar[$i+6]) >= 2){$ar_str.= $ar[$i].$ar[$i+1].$ar[$i+2].$ar[$i+3].$ar[$i+4].$ar[$i+5].$ar[$i+6].' ';}
                                    }
                                }
                            }
                        } 
                    }elseif ( $oldsw == 1 OR $oldsw == 0 ){
                        $ar_str.= $ar[$i];
                    }
                    $oldsw=$sw;
                 }
            
            
            }
            //去掉连续的空格
            $ar_str = trim(preg_replace("# {1,}#i"," ",$ar_str));
            $ar_str = preg_replace("/[^\s\x{4e00}-\x{9fa5}]/u",'',$ar_str);
            $rst =  explode(' ',$ar_str);
            if(!empty($eg)){
                foreach($eg[0] as $val){$rst[count($rst)] = $val;}
            }
            return $rst;
        }
    }
    print_r(Detach::dualDecom('中文字符'));
    ?>
    结果:Array ( [0] => 中文 [1] => 中文字 [2] => 中文字符 [3] => 文字 [4] => 文字符 [5] => 字符 ) 注意程序执行需要utf-8编码!
      

  13.   

    你们看我这个方法怎么样?
    以"服装合同"为例:
    1查 字段中有"服"的结果弄成一个result1表
    2在result1里面查有"装"的结果
    依次类推
    我记得Mysql里有表的嵌套查询
    Oracle里好像不行
    嘿嘿