参考:http://deerchao.net/tutorials/regex/regex.htm
https://www.cnblogs.com/kevin-yuan/archive/2012/09/25/2702167.html

正则可视化:https://regexper.com/
本地正则软件:regester.zip

通常在//里面
^ 开始 $ 结束 /^ $/
\b \bhi\b 代表着单词的开头和结尾(匹配结果是单独的:hi)
. 匹配除了换行符以外的任意字符

  • 前边的内容可以连续重复任意次
  • 重复一次或更多次
    ? 重复零次或一次
    {} 如果想连续匹配 8 次,{8},{5,12} 必须是 5-12 次
    \d 匹配的是任意的数字
    \s 匹配任意空白符(包括空格、制表符、换行符、全角空格)
    \w 匹配字符字母或数字或下划线或汉字
    如果开启了处理多行的工具,^ $ 就变成了匹配行的开始和结束处
    如果想要查找 . 或 * 时会被认为元字符,可以使用转义 \ (查找 \ 本身也要转义 \)
    [yichen] 匹配里面任意一个字母

例子:匹配 (010)88886666 或 022-23234567 或 05412367541 等格式的电话号码
(?0\d{2}[) -]?\d{8}
首先是 ( 匹配零次或一次 ?,然后是一个 0,再是两个数字,然后是 ) - 中的任意一个,后面再跟 8
有个问题,会出现 010)13293610 这种明显不正确的格式
要解决这种问题需要用 | 把不同的规则分隔开

0\d{2}-\d{8}|0\d{3}-\d{7} 表示的是:23-79541357 和 213-4851247
(0\d{2})[- ]?\d{8}|0\d{2}[- ]?\d{8} 表示的是:(024)-14765423 或 043-54761258(也可以没有-或者空格)
需要注意的是使用分支条件时,会从左向右的测试每一个条件,如果满足了一个分支的话,就不会管其他条件了
这就意味着:\d{5}|\d{5}-\d{4},只会匹配前五位

如果想重复多个字符的话可以用小括号指定子表达式
(\d{1,3}.){3}\d{1,3} 可以用来匹配 IP 地址,\d{1,3} 匹配 1-3 位数字,. 是转义,直接显示 . ,(\d(1,3).){3} 会匹配三个数字加一个点这种形式 3 次,最后再加上 1-3 位数字
然而这样的还是会匹配到 500.900.456.852 这样的,但是这则表达式中不提供算数比较,所以只能使用冗长的分组进行描述:((2[0-4]\d|25[0-5]|[0-1]?\d\d?).){3}(2[0-4]\d|25[0-5}|[0-1]?\d\d?)

如果需要查找不属于某个能简单定义的字符类的字符,比如想查找除了数字之外,其他任意字符都行
可以使用转义:
\W 匹配任意不是字母、数字、下划线、汉字的字符
\S 匹配任意不是空白符的字符 \S+ 匹配不包含空白符的字符串
\D 匹配任意非数字的字符
\B 匹配不是单词开头或结束的字符
[^x] 匹配除了 x 以外的任意字符
[^ aeiou] 匹配除了 aeiou 这几个字母以外的任意字符
<a[^>]+> 匹配尖括号括起来的以 a 开头的字符串

向后引用:使用小括号制定一个子表达式之后,匹配这个子表达式的文本可以在表达式或其它程序中作进一步引用处理。默认情况下,每个分组会自动拥有一个组号,规则:从左向右,以分组的左括号为标志,第一个出现的的分组组号为 1,第二个为 2,以此类推,\1 代表分组 1 匹配的文本(分组 0 代表着整个正则表达式)

\b(\w+)\b\s+\1\b 首先是一个字母,然后是任意字符一次或多次,再是一个字母,然后是一个或任意多个空白符,到这里就用到了分组 1,也就是 (\w+) 匹配到的任意字符

也可以自己定义子表达式的组名:(?\w+) 把尖括号换成 ‘ 也可以,这样就把 \w+ 的组名指定成了 Word 了,要使用这个分组可以使用 \k

分类 代码/语法 说明
捕获 (exp) 匹配 exp,并捕获文本到自动命名的组里
(?exp) 匹配 exp,并捕获文本到名称为 name 的组里面,也可以写成 (?’name’exp)
(?:exp) 匹配 exp,不捕获匹配的文本,也不给此分组分配组号
零宽断言 (?=exp) 匹配 exp 前面的位置
(?<=exp) 匹配 exp 后面的位置
(?!exp) 匹配后面跟的不是 exp 的位置
(?<!exp) 匹配前面不是 exp 的位置
注释 (?#comment) 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读

//修正符:i 不区分大小写的匹配;

//如:”/abc/i”可以与 abc 或 aBC 或 ABc 等匹配;
//修正符:g表示全局匹配
//修正符:m 将字符串视为多行,不管是那行都能匹配;

例://模式为:$mode=”/abc/m”;
//要匹配的字符串为:$str=”bcefg5e\nabcdfe”
//注意其中\n,换行了;abc 换到了下一行;
//$str和$mode 仍可以匹配,修正符 m 使得多行也可匹配;
//修正符:s 将字符串视为单行,换行符作为普通字符;

例://模式为:$mode=”/pr.y/“;
//要匹配字符串为:$str=”pr\ny”;
//两者不可匹配; . 是除了换行以外的字符可匹配;
//修改下模式为:$mode=”/pr.y/s”;
//其中修正符 s 将\n 视为普通字符,即不是换行;
//最后两者可以匹配;
//修正符:x 将模式中的空白忽略;
//修正符:A 强制从目标字符串开头匹配;

例://$mode=”/abc/A”;
//可以与$str=”abcsdfi”匹配,
//不可以与$str2=”sdsdabc”匹配;
//因为$str2 不是以 abc 开头;
//修正符:D 如果使用$限制结尾字符,则不允许结尾有换行;

例://模式为:$mode=”/abc$/“;
//可以与最后有换行的$str=”adshabc\n”匹配;
//元子符$会忽略最后的换行\n;
//如果模式为:$mode=”/abc/D”,
//则不能与$str=”adshabc\n”匹配,
//修正符 D 限制其不可有换行;必需以 abc 结尾;
//修正符:U 只匹配最近的一个字符串;不重复匹配;

例:
如模式为:
$mode=”/a.*c/“;
$str=”abcabbbcabbbbbc” ;
preg_match($mode,$str,$content);
echo $content[0]; //输出:abcabbbcabbbbbc;

//如果$mode=”/a.c/“;变成$mode=”/a.\c/U“;
// 则只匹配最近一个字符串,输出:abc;

//修正符:e 配合函数 preg_replace()使用, 可以把匹配来的字符串当作正则表达式执行;