PS:整理了一些常用的正则表达式,主要最近在PHP项目中经常使用。
概述
典型的搜索和替换操作要求您提供与预期的搜索结果匹配的确切文本。虽然这种技术对于对静态文本执行简单搜索和替换任务可能已经足够了,但它缺乏灵活性,若采用这种方法搜索动态文本,即使不是不可能,至少也会变得很困难。
通过使用正则表达式:
- 可以测试字符串内的模式。例如,可以测试输入字符串,以查看字符串内是否出现电话号码模式或信用卡号码模式。这称为数据验证。
- 替换文本。可以使用正则表达式来识别文档中的特定文本,完全删除该文本或者用其他文本替换它。
- 基于模式匹配从字符串中提取子字符串。可以查找文档内或输入域内特定的文本。例如,您可能需要搜索整个网站,删除过时的材料,以及替换某些 HTML 格式标记。在这种情况下,可以使用正则表达式来确定在每个文件中是否出现该材料或该 HTML 格式标记。此过程将受影响的文件列表缩小到包含需要删除或更改的材料的那些文件。然后可以使用正则表达式来删除过时的材料。最后,可以使用正则表达式来搜索和替换标记。
正则表达式的常用语法
正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符")组成的文字模式。模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
- 普通字符:普通字符包括没有显式指定为元字符的所有可打印和不可打印字符。这包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号。
-
非打印字符:非打印字符也可以是正则表达式的组成部分。下表列出了表示非打印字符的转义序列:
\cx
:匹配x指明的控制字符。\f
:匹配一个换页符。等价于\cL
。\n
:匹配一个换行符。等价于\cJ
。\r
:匹配一个回车符。等价于\cM
。\s
:匹配任何空白字符,包括空格、制表符、换页等。\S
:匹配任何非空白字符。\t
:匹配一个制表符。\v
:匹配一个垂直制表符。
- 特殊字符:
$
:匹配输入字符串的结尾位置,要匹配$字符本身,请使用\$
。()
:标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用\(
和\)
。*
:匹配前面的子表达式零次或多次。要匹配*
字符,请使用\*
。+
:匹配前面的子表达式一次或多次。要匹配+
字符,请使用\+
.
:匹配除换行符\n
之外的任何单字符。要匹配.
,请使用\
。[
:标记一个中括号表达式的开始。要匹配[
,请使用\[
。?
:匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配?
字符,请使用\?
。\
:将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如,'n'
匹配字符'n'
。'\n'
匹配换行符。序列'\\'
匹配"\"
,而'\('
则匹配"("
。^
:匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。要匹配^
字符本身,请使用\^
。{
:标记限定符表达式的开始。要匹配{
,请使用\{
。|
:指明两项之间的一个选择。要匹配|
,请使用\|
。
- 限定符:限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有*或+或?或{n}或{n,}或{n,m}共6种。正则表达式的限定符有:
*
:匹配前面的子表达式零次或多次。例如,zo*
能匹配 "z" 以及 "zoo"。* 等价于{0,}
。+
:匹配前面的子表达式一次或多次。例如,zo+
能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。?
:匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。{n}
:n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。{n,}
:n 是一个非负整数。至少匹配n次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。{n,m}
:m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。
PS:通过在 *、+ 或 ? 限定符之后放置 ?,该表达式从"贪心"表达式转换为"非贪心"表达式或者最小匹配。
- 定位符:定位符使您能够将正则表达式固定到行首或行尾。它们还使您能够创建这样的正则表达式,这些正则表达式出现在一个单词内、在一个单词的开头或者一个单词的结尾。
^
:匹配输入字符串开始的位置。$
:匹配输入字符串结尾的位置。b
:匹配一个字边界,即字与空格间的位置。B
:非字边界匹配。
正则表达式实践
提取<>()[]{}括号内的字符串
$str="你好<我>(爱)[北京]{天安门}";
echo f1($str); //返回你好
echo f2($str); //返回我
echo f3($str); //返回爱
echo f4($str); //返回北京
echo f5($str); //返回天安门
function f1($str)
{
$result = array();
preg_match_all("/^(.*)(?:<)/i",$str, $result);
return $result[1][0];
}
function f2($str)
{
$result = array();
preg_match_all("/(?:<)(.*)(?:>)/i",$str, $result);
return $result[1][0];
}
function f3($str)
{
$result = array();
preg_match_all("/(?:\()(.*)(?:\))/i",$str, $result);
return $result[1][0];
}
function f4($str)
{
$result = array();
preg_match_all("/(?:\[)(.*)(?:\])/i",$str, $result);
return $result[1][0];
}
function f5($str)
{
$result = array();
preg_match_all("/(?:\{)(.*)(?:\})/i",$str, $result);
return $result[1][0];
}
Comments | NOTHING