php 站内搜索 模糊匹配怎么实现 比如 一个文章标题为 要求输入‘服装合同’就能搜索到 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 WHERE title like '%服装合同%' 那要看你的存储结构,如果是数据库,可以用like语句来模糊匹配如果是XML,可以用正则来模糊匹配 [Quote=引用 1 楼 jzh2004 的回复:]WHERE title like '%服装合同%'[/Quot这样不行, 服装合同连在一起了 WHERE title like '%服装%' AND title like '%合同%' 急急急 PHP正则怎么匹配中文 把 服装合同 分开 你不用查数据库吗?查的话就是这样模糊查询的条件,如果像2楼说的是从XML里取,那么才需要正则 中文分词http://www.ftphp.com/scws/ 好的,谢谢。邮箱[email protected] 直接发这里给你吧,顺便分享下!<?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出来就知道了!你可以根据自己的需求修改里面的拆分规则!然后再到你的库里去模糊搜索,得出你要的结果! $dt = new Detach();$a = $dt->dualDecom('中文字符');print_r($a);输出结果Array ( [0] => ) 那就麻烦了 你要中文分词 ~~不过呢,你可以搜索一下 solr 。一个很好的搜索引擎 <?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编码! 你们看我这个方法怎么样?以"服装合同"为例:1查 字段中有"服"的结果弄成一个result1表2在result1里面查有"装"的结果依次类推我记得Mysql里有表的嵌套查询Oracle里好像不行嘿嘿 从已有表中查询数据并批量插入到结构不相同的另一个表中 php输出文件是否有大小限制? 读取文件夹里面的图片,然后修改图片的标题 中文URL传值问题,很难的 大家帮忙给这个东西估个价吧 求救,急急急!!此程序在linux下很正常,为何在windows下去不能正常运行 这段编辑php文件的代码为何是这种效果? 请问PHP如何连接Access的数据库呢? 单引号还是双引号? php如何打开网站主页并输入账号密码验证码进行登陆 php和.net做接口 title like '%$key%' " 中有$key 用mysql_real_escape_string的问题
如果是XML,可以用正则来模糊匹配
WHERE title like '%服装合同%'
[/Quot
这样不行, 服装合同连在一起了
你不用查数据库吗?查的话就是这样模糊查询的条件,如果像2楼说的是从XML里取,那么才需要正则
http://www.ftphp.com/scws/
好的,谢谢。邮箱[email protected]
/**
*
* <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出来就知道了!你可以根据自己的需求修改里面的拆分规则!
然后再到你的库里去模糊搜索,得出你要的结果!
$a = $dt->dualDecom('中文字符');
print_r($a);输出结果
Array ( [0] => )
不过呢,你可以搜索一下 solr 。一个很好的搜索引擎
/**
*
* <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编码!
以"服装合同"为例:
1查 字段中有"服"的结果弄成一个result1表
2在result1里面查有"装"的结果
依次类推
我记得Mysql里有表的嵌套查询
Oracle里好像不行
嘿嘿