1、preg_match($reg, $str, $match)
$reg 表示需要搜索匹配的正则表达式
$str 表示需要搜索的目标字符串
$match 表示第一个匹配的数组
返回值是数值型,表示匹配成功的个数
<?php header('content-type: text/html; charset=utf8'); ini_set('display_errors', true); $str = 'yftest: 1833abcefg: 8888: test'; $reg = '/(\w+): (\d+)/'; $abc = preg_match($reg, $str); var_dump($abc); //输出 C:\wamp64\www\learn\test.php:7:int 1
preg_match($reg, $str, $match); var_dump($match); //输出 array (size=3) // 0 => string 'yftest: 1833' (length=12) 表示匹配总的字符串 // 1 => string 'yftest' (length=6) 表示匹配第一个括号的字符串 // 2 => string '1833' (length=4) 表示匹配第二个括号的字符串 ?>
2、preg_match_all($reg, $str, $match)
$reg 表示需要搜索匹配的正则表达式
$str 表示需要搜索的目标字符串
$match 表示第一个匹配的数组
返回值是数值型,表示匹配成功的个数
<?php header('content-type: text/html; charset=utf8'); ini_set('display_errors', true); $str = 'yftest: 1833abcefg: 8888: test'; $reg = '/(\w+): (\d+)/'; $abc = preg_match_all($reg, $str); var_dump($abc); //输出 C:\wamp64\www\learn\test.php:7:int 2 echo '<hr>'; preg_match_all($reg, $str, $match); var_dump($match); //输出 //array (size=3) // 0 => // array (size=2) 表示匹配的全部字符串 // 0 => string 'yftest: 1833' (length=12) // 1 => string 'abcefg: 8888' (length=12) // 1 => // array (size=2) 表示匹配上的第一个括号的全部字符串 // 0 => string 'yftest' (length=6) // 1 => string 'abcefg' (length=6) // 2 => // array (size=2) 表示匹配上的第二个括号的全部字符串 // 0 => string '1833' (length=4) // 1 => string '8888' (length=4) ?>
3、preg_replace($reg, $replacement, $str)
$reg 表示正则表达式
$replacement 表示需要替换成的目标字符
$str 表示被执行的字符串
<?php header('content-type: text/html; charset=utf8'); ini_set('display_errors', true); $str = 'today is good day; are you ok???'; $reg = "/od/"; $newStr = preg_replace($reg, 'haha', $str); echo $newStr; //输出 thahaay is gohaha day; are you ok??? ?>
如果要引用括号里的内容可以用$1...来代替
<?php header('content-type: text/html; charset=utf8'); ini_set('display_errors', true); $str = 'today is good day, yestoday notoday currenttoday yeschoose'; $reg = '/(today).*?(choose)/'; $res = preg_replace($reg, '$1 are you ok?', $str); var_dump($res); //输出 today are you ok? ?>
注:在匹配中文的时候需要进行转义,否则会出来乱码
<?php header('content-type: text/html; charset=utf8'); ini_set('display_errors', true); $res = '/./u'; $str = '我爱中国'; preg_match_all($res, $str, $match); var_dump($match); //输出 //array (size=1) // 0 => // array (size=4) // 0 => string '我' (length=3) // 1 => string '爱' (length=3) // 2 => string '中' (length=3) // 3 => string '国' (length=3) //如果需要匹配中文可以用以下正则 $reg = '/[\x{4e00}-\x{9fa5}]/u'; preg_match_all($reg, $str, $match); var_dump($match); //输出 //array (size=1) // 0 => // array (size=4) // 0 => string '我' (length=3) // 1 => string '爱' (length=3) // 2 => string '中' (length=3) // 3 => string '国' (length=3) ?>
i => 表示忽略大小写,m => 表示多行模式 ,U => 表示将整个正则表达式整体改成懒惰模式
<?php header('content-type: text/html; charset=utf8'); ini_set('display_errors', true); $str = '<img src="http://www.baidu.com"><div>this is baidu address</div>'; $reg = '/<img.*>/U'; preg_match($reg, $str, $match); var_dump($match); //输出 array (size=1) // 0 => string '<img src="http://www.baidu.com">' (length=32) ?>
4、preg_replace_callback($reg, $callback, $str)
$reg 表示正则表达式
$callback 表示回调函数
$str 表示需要被执行的目标字符串
<?php header('content-type: text/html; charset=utf8'); ini_set('display_errors', true); $str = 'helloworld, hiworld'; $reg = '/(hi)/'; $newStr = preg_replace_callback($reg, function($all){ var_dump(func_get_args()); return 'ok'; }, $str); var_dump($newStr); //输出 array (size=1) // 0 => // array (size=2) // 0 => string 'hi' (length=2) // 1 => string 'hi' (length=2) //C:\wamp64\www\learn\check.php:10:string 'helloworld, okworld' (length=19) ?>
5、preg_split($reg, $str)
$reg 表示正则表达式
$str 表示目标字符串
<?php header('content-type: text/html; charset=utf8'); ini_set('display_errors', true); $str = 'aaabbb3cccddd5eeefff66ggg'; $reg = '/\d+/'; $arr = preg_split($reg, $str); var_dump($arr); //输出 array (size=4) // 0 => string 'aaabbb' (length=6) // 1 => string 'cccddd' (length=6) // 2 => string 'eeefff' (length=6) // 3 => string 'ggg' (length=3) ?>
6、preg_filter($reg, $replacement, $str)
$reg 表示正则表达式,可以是一个数组
$replacement 表示需要替换成的字符,可以是一个数组
$str 表示目标字符串,可以是一个数组
<?php header('content-type: text/html; charset=utf8'); ini_set('display_errors', true); $str = 'aaabbb3cccddd5eeefff66ggg'; $strArr = [ 'aaaaaa', 'today is good 3 day', 'fdffeifje' ]; $regArr = [ '/a+/', '/\d+/', '/f+/', ]; $target = ['yesA', 'yesB', 'yesC']; $arr = preg_filter($regArr, $target, $str); var_dump($arr); //输出 yesAbbbyesBcccdddyesBeeeyesCyesBggg var_dump(preg_filter($regArr, $target, $strArr)); //输出 array (size=3) // 0 => string 'yesA' (length=4) // 1 => string 'todyesAy is good yesB dyesAy' (length=28) // 2 => string 'yesCdyesCeiyesCje' (length=17) ?>
7、preg_quote($str)
需要参数 str
并向其中 每个正则表达式语法中的字符前增加一个反斜线。
$str表示需要转义的字符
<?php header('content-type: text/html; charset=utf8'); ini_set('display_errors', true); $str = '$abc./+eeefffg?'; var_dump(preg_quote($str)); //输出 \$abc\./\+eeefffg\? ?>
8、正则的贪婪模式与懒惰模式
?符号放在元字符后面表示0或1,但如果放在量词后面表示将贪婪模式改为懒惰模式
<?php header('content-type: text/html; charset=utf8'); ini_set('display_errors', true); $str = '<img src="http://www.baidu.com"><div>this is baidu address</div>'; $reg = '/<img.*>/'; preg_match($reg, $str, $match); var_dump($match); //输出 array (size=1) // 0 => string '<img src="http://www.baidu.com"><div>this is baidu address</div>' (length=64) $newReg = '/<img.*?>/'; preg_match($newReg, $str, $match); var_dump($match); //输出 //array (size=1) // 0 => string '<img src="http://www.baidu.com">' (length=32) ?>
9、正则表达式分组的使用与反向引用
使用正则表达式进行匹配的时候,可以使用()将需要的内容括起来,每个小括号的内容就会被当作一个小组,并保存到数组中
第一个()的内容会保存到数组下标为1的元素中
第二个()的内容会保存到数组下标为2的元素中
以此类推(例子见preg_match的例子)
反向引用是当你在正则表达式中用\n(数字)时表示引用第n个括号里的正则表达式,如下例子:
<?php header('content-type: text/html; charset=utf8'); ini_set('display_errors', true); $str = 'sign are you ok sign today is good sign are day nice to meet you abc'; $reg = '/(sign\s+are).*\1/'; preg_match($reg, $str, $match); var_dump($match); //输出 //array (size=2) // 0 => string 'sign are you ok sign today is good sign are' (length=43) // 1 => string 'sign are' (length=8) ?>
10、正则表达式的其他要点
正则表达式中加(?:)表示非捕获的意思
<?php header('content-type: text/html; charset=utf8'); ini_set('display_errors', true); $str = 'today is good day, yestoday notoday currenttoday'; $res = '/(?:today).*?(?:day)/'; preg_match_all($res, $str, $match); var_dump($match); //输出 array (size=1) // 0 => // array (size=2) // 0 => string 'today is good day' (length=17) // 1 => string 'today notoday' (length=13) ?>
// 前瞻: exp1(?=exp2) 查找exp2前面的exp1 // 后顾: (?<=exp2)exp1 查找exp2后面的exp1 // 负前瞻: exp1(?!exp2) 查找后面不是exp2的exp1 // 负后顾: (?<!exp2)exp1 查找前面不是exp2的exp1
exp1(?=exp2)
<?php header('content-type: text/html; charset=utf8'); ini_set('display_errors', true); $str = 'helloworld, hellochina'; $reg = '/hello(?=world)/'; $res = preg_replace($reg, 'hi', $str); var_dump($res); ?>
(?<=exp2)exp1
<?php header('content-type: text/html; charset=utf8'); ini_set('display_errors', true); $str = 'helloworld, hiworld'; $reg = '/(?<=hi)world/'; $res = preg_replace($reg, 'china', $str); var_dump($res); //输出 helloworld, hichina ?>
exp1(?!exp2)
<?php header('content-type: text/html; charset=utf8'); ini_set('display_errors', true); $str = 'today is good day, yestoday notoday currenttoday yeschoose'; $reg = '/yes(?!today)/'; $res = preg_replace($reg, 'ok', $str); var_dump($res); //输出 today is good day, yestoday notoday currenttoday okchoose ?>
(?<!exp2)exp1
<?php header('content-type: text/html; charset=utf8'); ini_set('display_errors', true); $str = 'helloworld, hiworld'; $reg = '/(?<!hi)world/'; $res = preg_replace($reg, 'china', $str); var_dump($res); //输出 hellochina, hiworld ?>