正则表达式中文匹配问题

code-is-poetry 2016-04-17 01:06:19
如何在下面的表达式中匹配出“示例页面“并读出结果?现在读出是乱码。

<?php
header("Content-Type:text/html;charset=utf-8");

$subject="世界,您好!示例页面safdasfdasfdsafaf0808080势";
$pattern='/[示例页面42424242432def42242342示例页面dsadfa]/';
preg_match($pattern,$subject,$matches);

echo $matches[0];

?>
...全文
320 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
code-is-poetry 2016-04-17
  • 打赏
  • 举报
回复
引用 21 楼 xuzuning 的回复:
少时,也不是人工拼接,而是用 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;
xuzuning 2016-04-17
  • 打赏
  • 举报
回复
少时,也不是人工拼接,而是用 join 连接数组元素为字符串 多时,就要改还思路:不是检查关键词是否包含在内容中,而是检查内容中含有那些关键词 这个用 trie 树就轻松搞定(精华区中有)
code-is-poetry 2016-04-17
  • 打赏
  • 举报
回复
引用 19 楼 xuzuning 的回复:
$pattern = "/世界,您好|示例页面|势/"; 拼接这样的字符串,应该不是难事吧?
少了可以这样人工拼接,但实际情况会有上万个。。。。
xuzuning 2016-04-17
  • 打赏
  • 举报
回复
$pattern = "/世界,您好|示例页面|势/"; 拼接这样的字符串,应该不是难事吧?
code-is-poetry 2016-04-17
  • 打赏
  • 举报
回复
引用 17 楼 xuzuning 的回复:
你是要做关键次匹配?
大概是这样的意思,在文章中找到所有包含在$linktitle中的关键词,然后再运行替换。
xuzuning 2016-04-17
  • 打赏
  • 举报
回复
你是要做关键次匹配?
code-is-poetry 2016-04-17
  • 打赏
  • 举报
回复
引用 14 楼 xuzuning 的回复:
那是不可能的!
正则用不了,那下面的情况怎么实现,求版主给个思路; 假设有个数组$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; 
code-is-poetry 2016-04-17
  • 打赏
  • 举报
回复
引用 14 楼 xuzuning 的回复:
那是不可能的!
哦,那就是说我要想办法把/[示例页面424世界,您好24242432de势f42242342示例页面dsadfa]/分隔开然后一个个拿去对了?
xuzuning 2016-04-17
  • 打赏
  • 举报
回复
那是不可能的!
code-is-poetry 2016-04-17
  • 打赏
  • 举报
回复
或者这么看吧:

$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]输出势
code-is-poetry 2016-04-17
  • 打赏
  • 举报
回复
引用 11 楼 xuzuning 的回复:
或是
$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 '成功';
}
xuzuning 2016-04-17
  • 打赏
  • 举报
回复
或是
$subject = "世界,您好!示例页面safdasfdasfdsafaf0808080势";
$pattern = '/示例页面.+/';
if(preg_match($pattern, $subject, $matches)) {
  echo ,$matches[0];
}
xuzuning 2016-04-17
  • 打赏
  • 举报
回复
那有什么? 你要的不就是这样吗
$subject = "世界,您好!示例页面safdasfdasfdsafaf0808080势";
$pattern = '/示例页面/';
if(preg_match($pattern, $subject)) echo '包含';
code-is-poetry 2016-04-17
  • 打赏
  • 举报
回复
引用 8 楼 xuzuning 的回复:
如果你要匹配到词组 示例页面 那就简单的 $pattern='/示例页面/';
问题是,实际项目中这个‘示例页面’不是单独出现的,他是一个对象数组的结果。就是把好多类似‘示例页面’(‘示例页面1’、‘示例页面2’等等)这样的字符串放到了一起,然后拿去和$subject="世界,您好!示例页面safdasfdasfdsafaf0808080势";匹配,看$subject是否包含‘示例页面’、‘示例页面1’、‘示例页面2’等中的任何一个,如果返回TRUE,则把匹配到的结果取出来备做他用。
xuzuning 2016-04-17
  • 打赏
  • 举报
回复
如果你要匹配到词组 示例页面 那就简单的 $pattern='/示例页面/';
code-is-poetry 2016-04-17
  • 打赏
  • 举报
回复
引用 5 楼 xuzuning 的回复:
对呀!你就是这么做的 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" } }
code-is-poetry 2016-04-17
  • 打赏
  • 举报
回复
引用 5 楼 xuzuning 的回复:
对呀!你就是这么做的 1、方括号的是字符列表,比配的就是单个字符 加 u 修饰是为了把 utf-8 汉字当作字符看待 2、preg_match 是只取第一组匹配的结果,preg_match_all 才是取所有匹配的结果
那要怎么才能匹配出“示例页面”?
xuzuning 2016-04-17
  • 打赏
  • 举报
回复
对呀!你就是这么做的 1、方括号的是字符列表,比配的就是单个字符 加 u 修饰是为了把 utf-8 汉字当作字符看待 2、preg_match 是只取第一组匹配的结果,preg_match_all 才是取所有匹配的结果
code-is-poetry 2016-04-17
  • 打赏
  • 举报
回复
引用 1 楼 jordan102 的回复:
什么意思?匹配出示例页面就直接写就行了啊。 $pattern='/示例页面/';
因为在项目中“示例页面”这样的字符串存在于其他中文字符内。
code-is-poetry 2016-04-17
  • 打赏
  • 举报
回复
引用 2 楼 xuzuning 的回复:
$pattern='/[示例页面42424242432def42242342示例页面dsadfa]/u';
谢谢版主回复 ,可是加了u只匹配出了“示”字。
加载更多回复(2)

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧