Home > Backend Development > PHP Tutorial > 正则表达式中文匹配问题

正则表达式中文匹配问题

WBOY
Release: 2016-06-20 12:31:04
Original
983 people have browsed it

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

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


回复讨论(解决方案)

什么意思?匹配出示例页面就直接写就行了啊。
$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 '包含';
Copy after login

或是

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

或是

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



不是,就是:

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

或者这么看吧:

$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]输出势
Copy after login

那是不可能的!

那是不可能的!


哦,那就是说我要想办法把/[示例页面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; 
Copy after login

你是要做关键次匹配?

你是要做关键次匹配?



大概是这样的意思,在文章中找到所有包含在$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;
Copy after login

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

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template