首页 > 后端开发 > php教程 > 正则表达式中文匹配问题

正则表达式中文匹配问题

WBOY
发布: 2016-06-20 12:31:04
原创
983 人浏览过

如何在下面的表达式中匹配出“示例页面“并读出结果?现在读出是乱码。

<?phpheader("Content-Type:text/html;charset=utf-8"); $subject="世界,您好!示例页面safdasfdasfdsafaf0808080势";$pattern='/[示例页面42424242432def42242342示例页面dsadfa]/';preg_match($pattern,$subject,$matches);echo $matches[0];?>
登录后复制


回复讨论(解决方案)

什么意思?匹配出示例页面就直接写就行了啊。
$pattern='/示例页面/';

$pattern='/[示例页面42424242432def42242342示例页面dsadfa]/ u';

什么意思?匹配出示例页面就直接写就行了啊。
$pattern='/示例页面/';



因为在项目中“示例页面”这样的字符串存在于其他中文字符内。

$pattern='/[示例页面42424242432def42242342示例页面dsadfa]/ u';



谢谢版主回复 ,可是加了u只匹配出了“示”字。

对呀!你就是这么做的
1、方括号的是字符列表,比配的就是单个字符
加 u 修饰是为了把 utf-8 汉字当作字符看待
2、preg_match 是只取第一组匹配的结果,preg_match_all 才是取所有匹配的结果

对呀!你就是这么做的
1、方括号的是字符列表,比配的就是单个字符
加 u 修饰是为了把 utf-8 汉字当作字符看待
2、preg_match 是只取第一组匹配的结果,preg_match_all 才是取所有匹配的结果


那要怎么才能匹配出“示例页面”?

对呀!你就是这么做的
1、方括号的是字符列表,比配的就是单个字符
加 u 修饰是为了把 utf-8 汉字当作字符看待
2、preg_match 是只取第一组匹配的结果,preg_match_all 才是取所有匹配的结果



这是 preg match all 的结果,还是不行呀

array(1) { [0]=> array(21) { [0]=> string(3) "示" [1]=> string(3) "例" [2]=> string(3) "页" [3]=> string(3) "面" [4]=> string(1) "s" [5]=> string(1) "a" [6]=> string(1) "f" [7]=> string(1) "d" [8]=> string(1) "a" [9]=> string(1) "s" [10]=> string(1) "f" [11]=> string(1) "d" [12]=> string(1) "a" [13]=> string(1) "s" [14]=> string(1) "f" [15]=> string(1) "d" [16]=> string(1) "s" [17]=> string(1) "a" [18]=> string(1) "f" [19]=> string(1) "a" [20]=> string(1) "f" } }

如果你要匹配到词组 示例页面
那就简单的 $pattern='/示例页面/';

如果你要匹配到词组 示例页面
那就简单的 $pattern='/示例页面/';


问题是,实际项目中这个‘示例页面’不是单独出现的,他是一个对象数组的结果。就是把好多类似‘示例页面’(‘示例页面1’、‘示例页面2’等等)这样的字符串放到了一起,然后拿去和$subject="世界,您好!示例页面safdasfdasfdsafaf0808080势";匹配,看$subject是否包含‘示例页面’、‘示例页面1’、‘示例页面2’等中的任何一个,如果返回TRUE,则把匹配到的结果取出来备做他用。

那有什么?
你要的不就是这样吗

$subject = "世界,您好!示例页面safdasfdasfdsafaf0808080势";$pattern = '/示例页面/';if(preg_match($pattern, $subject)) echo '包含';
登录后复制

或是

$subject = "世界,您好!示例页面safdasfdasfdsafaf0808080势";$pattern = '/示例页面.+/';if(preg_match($pattern, $subject, $matches)) {  echo ,$matches[0];}
登录后复制
登录后复制

或是

$subject = "世界,您好!示例页面safdasfdasfdsafaf0808080势";$pattern = '/示例页面.+/';if(preg_match($pattern, $subject, $matches)) {  echo ,$matches[0];}
登录后复制
登录后复制



不是,就是:

$subject="世界,您好!示例页面safdasfdasfdsafaf0808080势";$pattern='/[示例页面42424242432def42242342示例页面dsadfa]/';preg_match($pattern,$subject,$matches);if (preg_match){echo '成功';}
登录后复制

或者这么看吧:

$subject="世界,您好!示例页面safdasfdasfdsafaf0808080势";$pattern='/[示例页面424世界,您好24242432de势f42242342示例页面dsadfa]/';preg_match($pattern,$subject,$matches);if (preg_match){echo '成功'.'$matches[0]'.'$matches[1]','$matches[2]'}//$matches[0]应该输出示例页面,$matches[1]应该输出世界,您好,$matches[2]输出势
登录后复制

那是不可能的!

那是不可能的!


哦,那就是说我要想办法把/[示例页面424世界,您好24242432de势f42242342示例页面dsadfa]/分隔开然后一个个拿去对了?

那是不可能的!



正则用不了,那下面的情况怎么实现,求版主给个思路;

假设有个数组$A,里面放了38组数据,如何一次性随机取出38个值 ?
如下代码所示:

            //首先调出数据库中的title            $linktitle=$wpdb->get_results("SELECT post_title FROM $wpdb->posts WHERE post_status = 'publish'");            $nums=rand(1,38);            $post_title=$linktitle[$nums]->post_title;//里面有38个值            if ($post_title){                        //如果这38个值里有任意一个在文章中出现,则执行以下函数操作            $replace = array(                   $post_title => '<a href="http://host-7:8888/wiki/'.$post_title.'" >'.$post_title.'</a>',               );             $text = str_replace(array_keys($replace), $replace, $text);}                                      return $text; 
登录后复制

你是要做关键次匹配?

你是要做关键次匹配?



大概是这样的意思,在文章中找到所有包含在$linktitle中的关键词,然后再运行替换。

$pattern = "/世界,您好|示例页面|势/";
拼接这样的字符串,应该不是难事吧?

$pattern = "/世界,您好|示例页面|势/";
拼接这样的字符串,应该不是难事吧?



少了可以这样人工拼接,但实际情况会有上万个。。。。

少时,也不是人工拼接,而是用 join 连接数组元素为字符串
多时,就要改还思路:不是检查关键词是否包含在内容中,而是检查内容中含有那些关键词
这个用 trie 树就轻松搞定(精华区中有)

少时,也不是人工拼接,而是用 join 连接数组元素为字符串
多时,就要改还思路:不是检查关键词是否包含在内容中,而是检查内容中含有那些关键词
这个用 trie 树就轻松搞定(精华区中有)



成功了,不过没用你说的那个,是这样写的:

$linktitle=$wpdb->get_results("SELECT post_title FROM $wpdb->posts WHERE post_status = 'publish'");            // //遍历KEY             $i=0;             while($i<38){                            $pattern[$i]='/'.$linktitle[$i]->post_title.'/';              $replace[$i]='this is replace result';              $i++;              }            $content=preg_replace($pattern, $replace, $content)            return $content;
登录后复制

我这个也是正则表达式,是不是一样的啊,代码太多就不打了。http://www.manonggu.com/biancheng/391 

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板