even

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

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
?>

 

posted on 2019-08-30 23:58  even_blogs  阅读(316)  评论(0编辑  收藏  举报