【正则表达式 提高】环视,中文字处理

在正则规范中,我们可能会看到(?: pattern), (?!pattern ) (?<! pattern)  (?<=pattern), (?=pattern),这些叫做环视。

(?: pattern)非捕获匹配, 说白了就是系统不会捕获这个子表达式

(?!pattern)顺序否定环视,表示所在位置右侧不能匹配Expression

举例:(?!\|), 表示在这个位置的右侧不能出现 | 如果出现 | 则不会匹配。

 (?=pattern)顺序肯定环视, 表示所在位置的右侧能够匹配Expression

(?<! pattern)  :逆序否定环视, 表示所在位置左侧不能匹配Expression

(?<=pattern): 逆序肯定环视, 表示所在位置左侧能够匹配Expression

 

                //环视的举例

                $regex = '/

               

                                ^host = (?<!\.)([\d.]+)(?!\.)   (?#主机地址)

                                \|

                                ([\w!@#$%^&/*()_-+\])           (?#用户名)

                                \|

                                ([\w!@#$%^&*()_+\-])            (?#密码)

                                (?!\|)$

                /ix';

\x: 可以匹配中文字符

 

下面的程序是查找一段string中有多少中文字,有多少数字和字母。

/[\x{4e00}-\x{9fa5}]/iu
<?php

    //查找出游多少个汉字,多少个英文字母,多少数字
    $str = "awefawe66565awefaw文字母ef";
    //汉字按utf-8编码来说,它的范围是多少? 16进制  \x4e00-\x9fa5
    
    $reg1 = '/[\x{4e00}-\x{9fa5}]/iu';  //u is utf-8
    //{}: ground char form one pattern
    preg_match_all($reg1, $str, $res);
    
    echo "There are ".count($res[0])." Chinese letters";
    echo "<pre>";
    print_r($res);
    echo "</pre>";
    
    //a-zA-Z
    $reg2 = '/[a-zA-Z]/i';
    preg_match_all($reg2, $str, $res);
    
    echo "There are ".count($res[0])." Chinese letters";
    echo "<pre>";
    print_r($res);
    echo "</pre>";
    
    
    //0-9
    $reg3 = '/[0-9]/i';
    preg_match_all($reg3, $str, $res);
    
    echo "There are ".count($res[0])." Chinese letters";
    echo "<pre>";
    print_r($res);
    echo "</pre>";

 

 

题:结巴程序

我给出一个字符串,“我要要学学学...php”把他换成"我要学php"

<?php
    $str = "我要要学学学...php";
    
    //查找连续出现的相同中文字,并去匹配所有
    $reg4 = '/([\x{4e00}-\x{9fa5}])\1+/iu';
    preg_match_all($reg4, $str, $res);    

    /*
        Array
        (
            [0] => Array
                (
                    [0] => 要要
                    [1] => 学学学
                )

            [1] => Array
                (
                    [0] => 要
                    [1] => 学
                )

        )
    */
    
    //单独提取出res[1]中的内容作为replacement和pattern去替换str中的内容
    for($i = 0; $i < count($res[1]); $i++){
    
        $pattern = '/('.$res[1][$i].')\1+/iu';
        $replacement = $res[1][$i];
        $str = preg_replace($pattern, $replacement, $str);
    }//除去了所有结巴的中文字
    
    //除去...
    //...出现的次数必须大于或者等于2次
    $reg5 = '/(\.)\1+/i';
    $str = preg_replace($reg5, '', $str);
    
    echo "<pre>";
    print_r($str);
    echo "</pre>";    
 ?>

 

 

posted @ 2013-06-03 04:00  Zhentiw  阅读(301)  评论(0编辑  收藏  举报