PHP 的 POSIX 正则表达式实例讲解(上)

类别:编程语言 点击:0 评论:0 推荐:

PHP代码: <?php
// Title       : PHP 的 POSIX 正则表达式实例讲解(上)
// Author      : Stangly.Wrong
// Last modify : 2004.11.1
// Description : 正表达式作为一种强劲的字符串处理方法,深爱很多的编程爱好者
//               所喜爱,但是由于正则表达式的语法相对来说比较难以理解,所以
//               是初学者的一大难题。因此,本人在此简单的说一下自己学习正则
//               表达式的一些经验和方法,希望能够给各位兄弟朋友一点帮助。
//               本文大部分参照了<<PHP程序设计>>一书,本书对于我帮助很大。
// WebSite     : 前几天刚申请了 http://blog.csdn.net/stangly,用了两天也知道
//               了什么叫BLOG了。

// Function  myEreg($p, $s, $preg)
// 可以通过对 $preg 设置决定是否采用 POSIX 还是 兼容perl 的正则匹配
// 本文所采用的ereg()函数对大小定敏感  如果不想去区分大小写,
// 则可以使用 eregi() 函数去替代 ereg() 函数
// 如果匹配成功,则输出 Result is : True
// 否则输出 Result is : False
$title_prefix = '例 ';
$call_num = 1;
$title_suffix = '<br />';
function myEreg( $p, $s, $preg = FALSE )
{
    global $call_num, $title_prefix, $title_suffix;
    echo $title_prefix.$call_num.$title_suffix;
    $call_num++;
    $function_name = ( $preg ) ? 'preg_match' : 'ereg' ;
    echo "\$p = \"$p\" <br />";
    echo "\$s = \"$s\" <br />";
    echo "Call function is : $function_name(\$p, \$s) <br />";
    if ( $function_name($p, $s) )
        echo "Result is : True <br /><br />\r\n";
    else
        echo "Result is : False <br /><br />\r\n";

    return True;
}

// -----------------------------------------------------------------
// 学习开始 --------------------------------------------------------
// -----------------------------------------------------------------
// 最简单的一种匹配模式
// 从 $s 中寻找 $p 字符串
// 例 1 匹配失败 $p 出现在 $s 中
$p = 'jear';
$s = 'I love jear forevery!';
myEreg($p, $s);

// -----------------------------------------------------------------
// 匹配特殊字符 比如 $ . ^ 等,属于正则表达式的相关字符
// 使用  对这些字符进行转义
// 例 2  本例匹配将成功,如果剔除  将失败
$p = '\$100';
$s = 'I want lend jear $100.';
myEreg($p, $s);
// 此处将直接使用 $ 去匹配
// 例 3 匹配失败
$p = '$100';
myEreg($p, $s);

// -----------------------------------------------------------------
// 使用 ^ 匹配
// ^ 指出必须与字符串的开头字符串匹配
// 例 4 本例匹配失败 $p 虽然出现在 $s 中,但不是在开头位置
$p = '^jear';
myEreg($p, $s);
// 例 5 本例匹配成功,$p 在 $s 的开头位置
$s = 'jear is my good friend !';
myEreg($p, $s);

// -----------------------------------------------------------------
// 使用 $ 匹配
// $ 指出必须表示它必须与字符串的末尾字符串匹配
// 例 6 本例匹配失败 $p 不是在 $s 的尾部出现
$p = 'jear$';
myEreg($p, $s);
// 例 7 本例匹配成功,$p 在 $s 的尾部出现
$s = 'I love jear';
myEreg($p, $s);

// -----------------------------------------------------------------
// 使用 . 匹配
// . 可以匹配任意单个字符
// 例 8 本例匹配成功
$p = 'je.r';
$s = 'jear';
myEreg($p, $s);
// 例 9 匹配失败
$s = 'jer';
myEreg($p, $s);

// -----------------------------------------------------------------
// 使用 [] 预定义一个类进行匹配
// 仔细观察 $s 的书写,与 $p 比较
// 例 10 匹配成功
$p = 'j[eE]ar';
$s = 'I love jear.';
myEreg($p, $s);
// 例 11 匹配成功
$s = 'I love jEar';
myEreg($p, $s);
//例 12 匹配失败 因为 jaar 不符合 $p 所定义的一个类串
$s = 'I love jaar.';
myEreg($p, $s);

// -----------------------------------------------------------------
// 使用 [^] 去排除一个预定义的类
// 例 13 匹配成功
// 在进行匹配时,$p 规定了 在 j 字母后只要不出现 abcd ,同时尾部是以
// ar 结束的,即匹配成功
$p = 'j[^abcd]ar';
$s = 'I love jear just love my self !';
myEreg($p, $s);
// 例 14 匹配失败
$s = 'I love jaar !';
myEreg($p, $s);

// -----------------------------------------------------------------
// 使用 - 方式去在 [] 类中 定义一个范围
// 例 15 匹配成功 因为 预定义类指出字符范围为 0 到 6,而 3th 的 th 前
// 数字 3 处在这一类范围内
$p = '[0-6]th';
$s = 'This is the 3th month that i gets along with jear!';
myEreg($p, $s);
// 例 16 匹配失败 自己分析一下原因
$s = 'This is the 9th month that i gets along with jear!';
myEreg($p, $s);

// 例 17 匹配成功 使用 ^ 类似于取反运算
$p = '[^0-6]';
myEreg($p, $s);

// 例 18 匹配成功
$p = 'je[a-z]r';
$s = 'I love jear!';
myEreg($p, $s);

// 例 19 匹配成功 解决大小写匹配
$p = 'je[a-zA-Z]r';
$s = 'I love jeAr !';  // or $s = 'I love jear !';
myEreg($p, $s);

// -----------------------------------------------------------------
// 使用 | 做选择性匹配
// | 可以去做一个选择性的匹配.
// 例 20 匹配成功
$p = 'jear|cxj|cat';
$s = 'I love jear !';
myEreg($p, $s);
// 例 21 匹配成功
$s = 'I love cxj !';
myEreg($p, $s);
// 例 22 匹配成功 组合 [] - 方式去匹配
$p = '^([[a-zA-Z]ear)';
$s = 'Jear is my good friend !';
myEreg($p, $s);
// 例 23 匹配成功
$s = '0ear is my good firend !';
myEreg($p, $s);

// -----------------------------------------------------------------
// 使用 + 号去匹配重复字符,重复次最少是一次
// 例 24 匹配成功 Be+p 指定对于e字符可以最少重复一次,最多重复次不限
$p = 'Be+p';
$s = 'Beep';
myEreg($p, $s);
// 例 25 匹配成功
$s = 'Beeeep';
myEreg($p, $s);

// -----------------------------------------------------------------
// 使用 ? 号去匹配重复字符, 与 + 号类似,但不规定重复最少次数,
// 规定了最多只能重复一次
// 例 26 匹配成功
$p = 'Be?p';
$s = 'Bp';
myEreg($p, $s);
// 例 27 匹配失败 因为 e 出现了两次
$p = 'Be?p';
$s = 'Beep';
myEreg($p, $s);

// -----------------------------------------------------------------
// 使用 * 号匹配重复字符, 与 + 号类似, 没有规定最少重复次数
// 例 28 匹配成功
$p = 'Be*p';
$s = 'Beep';
myEreg($p, $s);
// 例 29 匹配成功
$p = 'Be*p';
$s = 'Bp';
myEreg($p, $s);
// 例 30 匹配成功
$p = 'Be*p';
$s = 'Beeeeeeeeeep';
myEreg($p, $s);

// -----------------------------------------------------------------
// 使用 {n} 号规定出现的具体次数
// 例 31 匹配成功  规定 e 字符必须出现两次
$p = 'Be{2}p';
$s = 'Beep';
myEreg($p, $s);
// 例 32 匹配失败
$s = 'Beeep';
myEreg($p, $s);
// 例 33 匹配失败
$s = 'Bep';
myEreg($p, $s);

// -----------------------------------------------------------------
// 使用 {n,m} 号规定出现的最少和最大次数
// 例 34 匹配成功  规定 e 字符可以不出现在 $s 里, 但最多可以出现 2 次
$p = 'Be{0,2}p';
$s = 'Beep';
myEreg($p, $s);
// 例 35 匹配成功
$s = 'Bp';
myEreg($p, $s);
// 例 36 匹配失败 e 出现次数为3 次,超过规定的2 次限定
$s = 'Beeep';
myEreg($p, $s);

// -----------------------------------------------------------------
// 使用 {n,} 号规定出现的最少次数,但不规定最多次数
// 例 37 匹配成功
$p = 'Be{1,}p';
$s = 'Bep';
myEreg($p, $s);
// 例 38 匹配成功
$p = 'Be{1,}p';
$s = 'Beeeeeep';
myEreg($p, $s);
// 例 39 匹配失败 e 没有在 $s 中出现,而规定必须要出现 1 次
$p = 'Be{1,}p';
$s = 'Bp';
myEreg($p, $s);

// ----------------------------------------------------------------
// () 的使用 联系以下实例 将多个正则联系起来,作为一个单独个体对待
// 例 41 匹配成功
$p = '^(good|best)';
$s = 'good';
myEreg($p, $s);
// 例 42 匹配成功
$s = 'best';
myEreg($p, $s);

// ----------------------------------------------------------------
// 更多的示例
// ----------------------------------------------------------------
// 例 43 匹配日期示例 0000-00-00 到 9999-99-99 没有规定检查日期的合法性
$p = '[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}';
$s = '2004-12-1';
myEreg($p, $s);

// 原先想更多的示例 ,现在手实也酸得慌, 没办法,晚上还要去讲课。
// 今天就到这个地方吧。 这几天有空的话,会再写出下半部分。去做
// 正则表达式的其它的几个用法和与perl兼容的一些函数使用。

// 参考文章:<<php程序设计>> 中国电力出版社  亏了这本书要不我不可能做到总结的。
//           网上众多兄弟的好文章  不一一列举

?>

本文地址:http://com.8s8s.com/it/it25957.htm