JavaScript与PHP中正则

简介: 有个在线调试正则的工具,点击查看工具。下面的所有示例代码,都可以在codepen上查看到。

1.创建正则表达式


var re = /ab+c/; //方式一 正则表达式字面量
var re = new RegExp("ab+c");  //方式二 RegExp对象的构造函


1)正则表达式字面量在脚本加载后编译。若你的正则表达式是常量,使用这种方式可以获得更好的性能。

2)使用构造函数,提供了对正则表达式运行时的编译。当你知道正则表达式的模式会发生改变, 或者你事先并不了解它的模式或者是从其他地方(比如用户的输入),得到的代码这时比较适合用构造函数的方式。

 

2.正则表达式中的特殊字符


\    ^    $    *    +    ?    .    (x)    (?:x)    x(?=y)    x(?!y)    x|y    {n}   
{n,m}    [xyz]    [^xyz]    [\b]    \b    \B    \cX    \d    \D    \f    \n    \r    
\s    \S    \t    \v    \w    \W    \n    \0    \xhh    \uhhhh   


3.正则表达式中的方法

6个,分别是exectestmatchsearchreplacesplit

exec和test的语法都是regexObj调用,match、search、replace和split的语法都是string调用。

exec

方法为指定的一段字符串执行搜索匹配操作。它的返回值是一个数组或者 null。语法如下:


image.png


示例代码:


var re = /quick\s(brown).+?(jumps)/ig;
var result = re.exec('The Quick Brown Fox Jumps Over The Lazy Dog');


返回结果:

image.png

 

test


一个在字符串中测试是否匹配的RegExp方法,它返回true或false。语法如下:


image.png

 

match


一个在字符串中执行查找匹配的RegExp方法,它返回一个数组或者在未匹配到时返回null

与exec略有不同,首先是调用方式,math是由字符串调用,而exec是由RegexObj调用。

其次,如果表达式中有“g”标记,那么返回一个匹配的字符串数组,如果没有就会和exec返回的一样。下面这个demo就是有“g”。语法如下:


image.png


示例代码:


var re = /quick\s(brown).+?(jumps)/ig;
var result = 'The Quick Brown Fox Jumps Over The Lazy Dog'.match(re);


返回结果:

image.png

 


search


一个在字符串中测试匹配的String方法,它返回匹配到的位置索引,或者在失败时返回-1。语法如下:


image.png


例如上面的示例代码如果是调用search,返回数据就是4。

 

replace


一个在字符串中执行查找匹配的String方法,并且使用替换字符串替换掉匹配到的子字符串。语法如下:


image.png


var re = /(\w+)\s(\w+)/;
var str = "John Smith";
var result = str.replace(re, "$2, $1");


返回的结果将是:“Smith, John”

 

split


一个使用正则表达式或者一个固定字符串分隔一个字符串,并将分隔后的子字符串存储到数组中的String方法。语法如下:


image.png


limit就是限制分割后的数组中的个数。下面的是一个demo,但是表达式中有一个是加了括号,一个没加,返回的数据是不一样的。

示例代码:


var re = /(\d)/;
var result = 'Hello 1 word. Sentence number 2.'.split(re);
console.log(result);
var re = /\d/;
var result = 'Hello 1 word. Sentence number 2.'.split(re);
console.log(result);


返回结果:


image.png


 

4.正则表达式执行返回信息


var myRe = new RegExp("d(b+)d", "g");
var myArray = myRe.exec("cdbbdbsbz");
console.log(myArray);


代码中返回的结果如下:

image.png

image.png

 

5.正则表达式标志


image.png


var re = /\w+\s/g;//表达式一
var re = new RegExp("\\w+\\s", "g");//表达式二
var str = "fee fi fo fum";
var myArray = str.match(re);
console.log(myArray);


表达式一和表达式二返回的结果是一样的。都是下面的那个数组:


image.png

 

二、PHP


下面的示例代码可以在ideone中查看到。


1.创建正则表达式


$regex = '/\d/i';


与JavaScript中的第一个方式有点像,只是这里的话是个字符串。

 

2.正则表达式中的特殊字符


特殊字符有:   . \ + * ? [ ^ ] $ ( ) { } = ! < > | : -

 

3.正则表达式中的函数


8个方法,preg_matchpreg_match_allpreg_replacepreg_replace_callbackpreg_greppreg_splitpreg_last_errorpreg_quote

 

preg_match

执行一个正则表达式匹配


image.png


返回 pattern 的匹配次数。 它的值将是0次(不匹配)或1次,因为preg_match()在第一次匹配后,将会停止搜索


$subject = "dd133aa2";
$pattern = '/\d+/';
preg_match($pattern, $subject, $matches, PREG_OFFSET_CAPTURE);
print_r($matches);

上面的示例代码加了参数“PREG_OFFSET_CAPTURE”,这样的话,在$matches中会多一个偏移数。例如下面的“2”


image.png


 

preg_match_all


执行一个“全局”正则表达式匹配


image.png


返回完整匹配次数(可能是0),或者如果发生错误返回FALSE


下面的代码中$subject和$pattern与上面的都一样,唯一不同的是preg_match换成了preg_match_all。

preg_match_all($pattern, $subject, $matches, PREG_OFFSET_CAPTURE);
print_r($matches);


返回的次数是2,匹配到了两次,再看看数组$matches中的输入,有两个。比上面的多了一个。


image.png

 


preg_replace


执行一个正则表达式的搜索和替换


image.png


如果subject是一个数组, preg_replace()返回一个数组, 其他情况下返回一个字符串

如果匹配被查找到,替换后的subject被返回,其他情况下 返回没有改变的 subject。如果发生错误,返回 NULL

在代码中$subject是一个数组,里面有两组字符串,接下来是将多个数字替换为大写的“Z”。


$subject = array("dd133aa2", "kk1ff3");
$pattern = '/\d+/';
$result = preg_replace($pattern, 'Z', $subject);
print_r($result);


image.png


 

preg_replace_callback


执行一个正则表达式搜索并且使用一个“回调”进行替换



image.png


这个函数的行为除了可以指定一个callback替代replacement进行替换 字符串的计算,其他方面等同于 preg_replace(),包括返回的结果。

下面的代码也是替换成大写的“Z”,回调函数中每次$matches中的内容就是代码中注释的部分,第一次是133,第二次是2。


$subject = "dd133aa2";
$pattern = '/\d+/';
$result = preg_replace_callback($pattern, function($matches) {
                //$matches [0] => 133
                //$matches [0] => 2
                return 'Z';
          }, $subject);
print_r($result);


preg_grep


返回匹配模式的数组条目


image.png


返回使用input中key做索引的数组

下面的示例代码中,在$subject数组中我加了个“ddsdfd”,里面没有包含数字,在做匹配的时候,就把这个没数字的给过滤掉了。

而$result2打印出来的正好相反,是把过滤的打印出来了,但是key还是为2,并不是0。

$subject = array("dd133aa2", "kk1ff3", "ddsdfd");
$pattern = '/\d+/';
$result = preg_grep($pattern, $subject);
$result2 = preg_grep($pattern, $subject, PREG_GREP_INVERT);
print_r($result);
print_r($result2);


image.png


 

preg_split

通过一个正则表达式分隔字符串


image.png


返回一个使用 pattern 边界分隔 subject 后得到 的子串组成的数组

下面代码中,我将$pattern中的表达式加了括号,为了在$result2中捕获到。


$subject = "dd133aa2cc";
$pattern = '/(\d+)/';
$result = preg_split($pattern, $subject);
$result2 = preg_split($pattern, $subject, null, PREG_SPLIT_DELIM_CAPTURE);
print_r($result);
print_r($result2);


image.png

 


preg_last_error

返回最后一个PCRE正则执行产生的错误代码


preg_match('/(?:\D+|<\d+>)*[!?]/', 'foobar foobar foobar');
$result = preg_last_error();//PREG_BACKTRACK_LIMIT_ERROR 调用回溯限制超出
print_r($result);

preg_quote


转义正则表达式字符


image.png


返回转义后的字符串


下面的代码中,$subject中有两个需要转义的字符,“.”和“?”。

将$result打印出后是“dd\.a\?a2cc”,而在$result2中,多加了个参数“a”,这样的话“a”也会被转义,“dd\.\a\?\a2cc”

$subject = "dd.a?a2cc";
$result = preg_quote($subject);
$result2 = preg_quote($subject, 'a');
print_r($result);
print_r($result2);


4.模式修正符


image.png

 

 


相关文章
|
7月前
|
JavaScript 数据安全/隐私保护
JS正则验证密码
JS正则验证密码
67 0
|
2月前
|
JavaScript Java PHP
快速对比:Django、Spring Boot、Node.js 和 PHP
快速对比:Django、Spring Boot、Node.js 和 PHP
83 7
|
6月前
|
存储 程序员 PHP
老程序员分享:Php中正则小结(一)
老程序员分享:Php中正则小结(一)
29 0
|
4月前
|
前端开发 JavaScript 安全
|
4月前
|
JavaScript 前端开发 网络安全
Node.js和php
【8月更文挑战第4天】Node.js和php
46 3
|
7月前
|
JavaScript Java 测试技术
基于微信小程序的家政服务预约系统的+php+vue.js附带文章和源代码设计说明文档ppt
基于微信小程序的家政服务预约系统的+php+vue.js附带文章和源代码设计说明文档ppt
75 3
基于微信小程序的家政服务预约系统的+php+vue.js附带文章和源代码设计说明文档ppt
|
6月前
|
SQL 监控 安全
代码审计-PHP原生开发篇&SQL注入&数据库监控&正则搜索&文件定位&静态分析
代码审计-PHP原生开发篇&SQL注入&数据库监控&正则搜索&文件定位&静态分析
|
6月前
|
JavaScript 程序员 索引
老程序员分享:JS基础知识(正则)
老程序员分享:JS基础知识(正则)
27 0
|
7月前
|
JavaScript Java 测试技术
基于微信小程序的社团活动助手php+vue.js附带文章和源代码设计说明文档ppt
基于微信小程序的社团活动助手php+vue.js附带文章和源代码设计说明文档ppt
41 1
|
7月前
|
JavaScript 前端开发
JS中正则方法的使用 - 蓝易云
以上就是JavaScript中正则方法的基本使用。这些方法可以用于执行复杂的字符串处理和验证任务。
47 1