PHP 正则表达式语法

合集下载

中级php面试题及答案(3篇)

中级php面试题及答案(3篇)

第1篇一、PHP基础题1. 请简述PHP的执行流程。

答:PHP代码的执行流程如下:(1)解析:PHP解释器首先读取PHP文件,然后对代码进行语法分析,将代码转换为中间代码。

(2)编译:PHP解释器将中间代码编译成字节码。

(3)执行:PHP虚拟机执行字节码,完成代码的功能。

2. 简述PHP的魔术方法。

答:魔术方法是PHP中一种特殊的方法,以双下划线开头和结尾,主要有以下几种:(1)构造函数:__construct()(2)析构函数:__destruct()(3)属性访问控制方法:getXXX()、setXXX()、callXXX()(4)克隆方法:__clone()(5)唤醒方法:__wakeup()3. 简述PHP中的数据类型。

答:PHP中的数据类型主要有以下几种:(1)基本数据类型:整型(int)、浮点型(float)、字符串(string)、布尔型(bool)(2)复合数据类型:数组(array)、对象(object)(3)特殊数据类型:NULL、资源(resource)4. 简述PHP中的常量。

答:常量是在程序运行过程中不可改变的变量,主要有以下几种定义方式:(1)使用define()函数定义:define("常量名",值);(2)使用const关键字定义:const 常量名 = 值;5. 简述PHP中的变量。

答:变量是在程序运行过程中可以改变的存储空间,主要有以下几种定义方式:(1)使用$符号定义:$变量名 = 值;(2)使用var关键字定义:var $变量名 = 值;二、面向对象编程题1. 简述面向对象编程的三大特征。

答:面向对象编程的三大特征为:(1)封装:将数据和操作数据的方法封装在一起,隐藏内部实现细节。

(2)继承:允许一个类继承另一个类的属性和方法。

(3)多态:允许不同的对象通过共同的接口进行操作。

2. 简述PHP中的访问修饰符。

答:PHP中的访问修饰符主要有以下三种:(1)public:允许类内部、子类和外部访问。

php常用函数

php常用函数

php常用函数PHP是一门非常流行的Web编程语言,它的强大功能和广泛的应用场景,使得PHP成为了Web开发领域的佼佼者。

在PHP中,有许多常用的函数可以帮助我们快速开发Web应用。

下面将介绍一些PHP常用函数。

字符串函数在PHP中,字符串函数是最常用的函数之一。

以下是一些常用的字符串函数:strlen():用于获取字符串的长度;substr():用于截取字符串的一部分;strpos():用于查找字符串中的子串;str_replace():用于替换字符串中的部分内容;strtoupper()和strtolower():分别用于将字符串转化为全大写和全小写;htmlspecialchars():用于将特殊字符转化为HTML实体,以避免跨站点脚本攻击。

数组函数数组是PHP中另一个非常重要的数据类型。

以下是一些常用的数组函数:count():用于获取数组的长度;array_push()和array_pop():分别用于向数组中添加元素和从数组中删除元素;array_merge():用于合并两个或多个数组;array_search():用于在数组中查找指定元素的位置;array_slice():用于截取数组的一部分。

文件操作函数在Web开发中,文件操作是非常常见的一个功能。

以下是一些常用的文件操作函数:fopen():用于打开一个文件;fwrite():用于向文件中写入内容;fread():用于从文件中读取内容;fclose():用于关闭一个文件;file_exists():用于判断一个文件是否存在。

日期时间函数在Web应用中,经常需要对日期和时间进行处理。

以下是一些常用的日期时间函数:time():用于获取当前时间的时间戳;date():用于格式化日期和时间;strtotime():用于将日期字符串转换为时间戳;mktime():用于获取指定日期时间的时间戳。

数学函数在Web开发中,数学计算是经常要用到的功能。

pcre支持的元字符以及语法及主要函数简介

pcre支持的元字符以及语法及主要函数简介

PCRE简介PCRE 扩展的正则表达式会有一个每个线程都可用的全局缓存用来缓存编译后的正则表达式. PCRE在php4.2.0中是默认启用的, 可以通过—without-pcre-regex禁用. 在php 5.3.0之后, 这个扩展不能被禁用. 但是仍然可以使用—with-pcre-regex=DIR来实用一个外部的pcre库进行编译配置pcre.backtrack_limit: 默认100000, pcre回溯限制pcre.recursion_limit: 默认100000, pcre的递归限制. 需要注意的是, 如果将这个值设置为一个很大的数字, 你可能会消耗掉所有的进程可用堆栈,并且最终导致php崩溃(直到到达系统限制的堆栈大小)预定义常量PREG_PATTERN_ORDER结果按照”规则”排序, 仅用于preg_match_all, 即$matches[0]是完整规则的匹配结果, $matches[1]是第一个子组匹配的结果PREG_SET_ORDER:结果按照”集合”排序, 仅用于preg_match_all, 即$matches[0]保存第一次匹配结果的所有结果(包含子组)信息, $matches[1]保存第二次的结果信息PREG_OFFSET_CAPTURE在捕获的结果中, 不仅包含结果子串, 还会包含子串在原字符串中的位置.PREG_SPLIT_NO_EMPTY告知preg_split仅返回非空的部分PREG_SPLIT_DELIM_CAPTURE告知preg_split同时捕获规则中的括号表达式匹配到的内容PREG_SPLIT_OFFSET_CAPTURE如果设置了这个标记, 每次匹配得到的结果的offset位置将会被同时返回.PREG_NO_ERROR如果preg_last_error调用后返回此值, 则表明正则没有错误PREG_INTERNAL_ERROR如果preg_last_error调用后返回此值, 则表明发生了PCRE内部错误PREG_BACKTRACK_LIMIT_ERROR如果回溯次数超过预设的值, preg_last_error函数返回此值PREG_RECURSION_LIMIT_ERROR如果递归次数超过预设的值, preg_last_error函数返回此值PREG_BAD_UTF8_ERROR如果preg的最后错误是由于异常的utf-8数据(仅在运行在utf-8模式正则表达式情况下)导致的, 那么preg_last_error返回此值PREG_BAD_UTF8_OFFSET_ERROR如果偏移量与合法的utf-8代码(仅在运行在utf-8模式正则表达式情况下)的开始点不匹配, preg_last_error 的调用返回此值PCRE_VERSION返回pcre版本号和发布日期.模式修饰符i PCRE_CLASSES大小写不敏感的修饰符m PCRE_MULTILINE多行匹配, 默认情况下, PCRE认为目标字符串是一组单行字符组成的(然而实际上它可能会包含多行). 元字符^仅匹配字符串的开始位置, 而元字符$则仅匹配字符串的末尾, 或者新行之前(除非设置了D修饰符). 这个修饰符和perl中工作一直, 使用后, ^和$会匹配每一行的开始和结尾如果目标字符串中没有/n字符或者模式中没有出现^和$, 则设置此修饰符是没有任何影响的.s PCRE_DOTALL用来增强字符类.(点号)的功能, 默认情况下, 点号匹配任意字符, 但不包括换行符及以后内容. 使用此修饰符后, 可以匹配任意字符包括换行符x PCRE_EXTENDED如果设置了这个修饰符, 模式中的空白字符, 除非被转义或者在一个字符类中, 否则都被忽略. 在一个未转义的#之后直到下一个换行符之间的内容都会被正则表达式引擎忽略以方便添加注释.e PREG_REPLACE_EVAL使用此修饰符后, preg_replace的$replacement参数除了可以使用正常的反向引用来取得匹配值, 还可以在其中书写eval语法允许的字符串进行求值, 并将返回结果用于最终的替换.A PCRE_ANCHORED如果设置了此修饰符, 模式被强制成为”anchored”(锚点), 也就是说约束使其始终从字符串的嘴前面开始搜索. 这个影响也可以通过构造适当的规则来实现(perl中只能这样实现)D PCRE_DOLLAR_ENDONLY如果设置了这个修饰符, $会匹配目标字符串的结尾之前, 而如果没有设置这个修饰符, 如果目标字符串最后一个字符时换行符, $就会匹配该换行符之前而不是字符串结尾之前.如果设置了m修饰符, 则这个修饰符会被忽略. 这一点和perl不一致S当一个模式需要多次使用的时候, 我们为了获得更高的匹配效率, 值得花费一些时间对其进行分析. 如果设置了这个修饰符, 将会进行这个额外的分析. 当前, 这种对一个模式的分析仅仅适用于非锚点的匹配(即没有一个单一固定的开始字符)U PCRE_UNGREEDY这个修饰符逆转了贪婪的模式, 如果没有这个设置, 默认情况下的正则匹配时贪婪的, 量词后增加了?的模式是非贪婪的, 但是如果设置了这个修饰符, 则刚好相反.这个规则与perl是不兼容的.也可以在模式中使用?U来达到同样的效果X PCRE_EXTRA这个修饰符启用了一个PCRE中与perl不兼容的额外功能. 任意反斜线后面跟一个没有特殊含义的字符会导致一个错误, 以此来保留这些组合以备后期扩展.默认情况下, 和perl一样, 反斜线后跟一个没有特殊含义的字符会以该字符原意解释.当前没有任何其他特性受此修饰符控制J PCRE_INFO_JCHANGED与内部选项?J相同, 用来改变本地PCRE_DUPNAMES选项. 允许子组有重复的名字u PCRE8这个修饰符打开一个PCRE中与perl不兼容的额外功能. 模式字符串被认为是UTF-8的.与perl的不同之处默认情况下,使用C库函数isspace()判定一个任意字符是否是空白字符, 尽管可以实用字符类表替代编译PCRE. 通常isspace()匹配空格, 换页, 换行, 回车, 水平制表符和垂直制表符. perl5不再将垂直制表符包括到空白字符集中. /v这个转移实际上在很长时间都没有得到perl文档的承认. 然而, 这个字符自身被认为是一个空白字符至少是在5.002之上. 在5.004和5.005它不和/s匹配.PCRE 不允许前瞻断言的量词修饰, perl允许这样做, 但是这并不是你想象的那样.例如, (?!a){3}并不意味着断言接下来三个字符不是a, 而是断言下一个字符不是a并进行3次.子模式的捕获发生在负向前瞻内部时会被计算, 但是在偏移向量中病没有设置它们的条目. perl从断言失败之前匹配得到的这些模式匹配结果中设置了它的数值变量 (因此是成功的), 但这也仅在负向前瞻断言只有一个分支的时候.尽管目标字符串中支持二进制0字符, 但是他们在模式字符串中是不允许的, 因为他们是通过普通的C字符串传递的, 而C字符串以0字符结束. 转义序列”/x00”可以在模式中用于表示二进制0字符.不支持下面的perl转义序列: /I, /u, /L, /U. 实际上这些都是通过perl一般的字符串处理来实现的, 而不是模式匹配引擎的一部分.不支持perl的/G断言, 因为它与单模式匹配没有关系.很显然, pcre不支持(?{代码})和(??{代码})的构造. 然而, 它支持递归模式在perl 5.005_02中当设置为捕获字符串的模式中有部分重复的时候会有一些古怪的现象发生, 比如:/^(a(b)?)+$/捕获aba的时候, $2会被设置为b, 然而, 如果把模式修改为/^(aa(bb)?)+$/的时候, 用aabbaa 去匹配, $2将不会得到匹配结果. 如果将模式修改为/^(aa(b(b))?)+$/的时候, $2和$3又都能够匹配到结果. 在perl 5.004中$2在这几种情况下都能够得到匹配结果, 并且PCRE中夜市这样. 如果未来perl修改为一致的那就不同了, PCRE可能接下来会修改.还有一个没有解决的差异是perl 5.005_02中, 模式/^(a)?(?(1)a|b)+$/会匹配字符串”a”, 而pcre中不会. 然而, perl和pcre中/^(a)?a/匹配”a”都会得到相同的结果, $1都未被设置.PCRE提供了一些对perl正则表达式的扩展1. 虽然后瞻断言要求必须匹配固定长度的字符串, 然而后瞻断言的每个可选分支还是可以实用不同长度的字符串的, 而perl 5.005中要求它们必须拥有同样的长度2. 如果PCRE_DOLLAR_ENDONLY设置了并且PCRE_MULTILINE没有设置, $元字符仅匹配字符末尾之前3. 如果PCRE_EXTRA设置了, 反斜线紧跟一个没有特殊含义的字符将会导致错误4. 如果PCRE_UNGREEDY设置了, 贪婪模式控制被逆转, 即: 默认是非贪婪模式, 在量词后增加?表明是贪婪模式.与POSIX正则的区别PCRE函数需要的模式以分隔符闭合的包含.不像POSIX, PCRE扩展没有专门的函数用来区分大小写敏感. 取而代之的是使用i这个模式修饰符来达到相同的效果. 其他模式修饰符也可以用来改变匹配策略.POSIX函数从最左面寻找最长的匹配, 但是PCRE在查找到第一个合法匹配后就结束. 如果字符串没有匹配到结果, 那么两者是没有差别的, 但是如果匹配到结果, 两者就会在结果和速度上都有差别. 为了说明这个不同之处, 考虑Jeffrey Friedl著的”精通正则表达式”一书中的例子. 使用one(self)?(selfsufficient)?这个模式来匹配oneselfsufficient这个字符串, PCRE将会产生oneself这个结果, 但是POSIX将会匹配到完整的字符串oneselfsufficient. 两者都从原始字符串中匹配到了结果, 但是POSIX需要的是最长的结果.函数列表mixed preg_replace(mixed $pattern, mixed $replacement, mixed $subject[, int $limit = -1[, int &$count]])执行一个正则表达式的搜索和替换. 从$subject中搜索与$pattern匹配的结果并使用$replacement替换它们.$pattern要搜索的模式. 可以是字符串或者一个字符串数组.e修饰符可以使preg_replace()函数在进行了参数替换(后向引用)后$replacement参数被当做php代码来执行. 请确保$replacement是合法的php代码, 否则会在包含preg_replace()的行上引发一个解析错误$replacement用于替换的字符串或字符串数组. 如果这个参数是字符串, 并且$pattern参数是一个数组, 所有的模式都是用这个字符串描述的规则进行替换. 如果$pattern和$replacement都是数组, 每个模式是用$replacement 中对应的字符串进行替换. 如果$replacement中的元素比$pattern中的元素少,那么$pattern中多出来的模式是用空字符串进行替换.$replacement可以使用//n或$n进行后向引用, 后者是首选的语法. 每个这样的后向引用语法会被替换为模式捕获到的第n个子组的匹配结果文本. n可以是0-99之间的数字. //0或者$0后向引用的是整个模式匹配到的结果文本. 捕获子组的序列(这里的n)指的是代表子组的圆括号中的左括号在模式中出现的顺序(即第一个左括号代表的子组n=1,第二个n=2,依此类推), 如果想要在$replacement中使用反斜线, 需要对其进行转义(即PHP字符串”////”)当$replacement规则使用后向引用工作时, 并且后向引用后面需要立即使用一个数值, 比如”//11”这个时候, 正则表达式引擎是没有办法判定你后向引用的子组是”//1”而不是”//11”,这种情况下使用语法/${1}1来解决, 用{}将后向引用子组序号1和原文字符串1进行隔离.当使用e修饰符时, 这个函数转义字符串中的一些字符(即: ’, “, /和空字符), 替换后向引用, 这些完成之后, 确保后向引用替换没有导致语法错误,然后会将$replacement作为php代码执行, 并将执行结果作为最终用来替换的字符串.$subject用于搜索和替换的源字符串或字符串数组.如果$subject是一个数组, 会搜索和替换每一个$subject中的元素, 并且同样返回一个数组$limit每个模式在每个$subject字符串中最大可以被替换的次数. 默认-1(不限制)$count一个引用方式的参数, 如果指定, 该参数最终被填充为进行替换的次数.返回如果$subject是一个数组, 返回数组, 否则返回字符串.如果找到匹配, 返回替换后新的$subject. 其他情况下$subject会无变化返回. 当发生错误时返回NULL.mixed preg_filter(mixed $pattern, mixed $replacement, mixed $subject[, int $limit = -1[, int &$count]])这个函数等同于preg_replace, 除了它仅仅返回匹配结果. 更多关于此函数如何工作的信息, 请查看preg_replace文档如果$subject参数是一个数组, 返回一个数组描述的匹配结果, 否则返回string如果没有匹配到任何结果或发生了错误, 在$subject是数组时返回空数组, 否则返回NULLarray preg_grep(string $pattern, array $input[, int $flags = 0])对$input中的每一个元素使用$pattern进行测试, 返回匹配的元素组成的数组. 如果$flags的值为PREG_GREP_INVERT, 那么将会返回不匹配的元素组成的数组. 返回的数组中元素的索引会被保留.int preg_last_error(void)返回最后一次pcre正则表达式执行的错误代码.PREG_NO_ERROR/PREG_INTERNAL_ERROR/PREG_BACKTRACK_LIMIT_ERROR/PREG_RECUR SION_LIMIT_ERROR/PREG_BAD_UTF8_ERROR/PREG_BAD_UTF8_OFFSET_ERROR等错误代码的意义详见pcre预定义常量部分.int preg_match_all(string $pattern, string $subject, array &$matches[, int $flags[, int $offset]])从$subject中搜索所有与$pattern给定正则表达式匹配的结果, 并且将匹配到的结果按照$flags指定的顺序放入$matches在第一个匹配发现后, 子序列继续搜索直到最后一个匹配.$pattern用于搜索的模式$subject输入字符串$matches保存匹配结果的多维数组, 顺序依赖于$flags参数$flags可以是以下值的组合.(注意, 这并不是说PREG_PATTERN_ORDER和PREG_SET_ORDER可以同时使用)如果没有给定任何flag, 默认启用的是PREG_PATTERN_ORDER译注: 一个模式可能在字符串中发现多个匹配, 一个模式也会有多个子组, 这里的排序flag用来指明第一维表示子组还是多次匹配PREG_PATTERN_ORDER: $matches[0]中包含第一个子组中所有匹配到的结果, $matches[1]中包含第二个子组中所有匹配到的结果.PREG_SET_ORDER: $matches[0]中包含第一次匹配得到的结果(包含所有子组), $matches[1]包含第二次匹配得到的结果(包含所有子组)PREG_OFFSET_CAPTURE: 如果传递了这个flag, 每一个匹配的字符串在返回时都会包含它在原始字符串中的偏移量. 注意: 这会改变$matches中最终输出的匹配结果数组元素, 原来是二维数组, 且第二维值是匹配到的字符串, 使用此flag后, 第二维会成为一个数值索引的数组,其中第一个元素是匹配得到的字符串, 第二个元素是该匹配结果在原始字符串($subject)中的偏移量$offset模式$pattern从字符串($subject)的什么位置开始搜索. 这个可选参数用来控制从指定位置开始搜索(单位是字节)注意: 实用$offset参数和传递实用substr($subject, $offset)截取后的$subject到preg_match_all()函数中是不一样的, 因为使用了$offset之后, $pattern依然可以使用^, $元字符进行首尾判断, 并且可以使用(?<=xx)进行前瞻断言.返回返回完成模式成功匹配的次数(可能是0), 当发生错误时返回FALSEchangelogphp5.2.2中, $pattern开始可以使用(?<name>), (?’name’)以及(?P<name>)来进行子组命名, 之前的版本中只接受(?P<name>)语法.int preg_match(string $pattern, string $subject[, array &$matches[, int $flags[, int $offset]]])使用$pattern搜索$subject的一个匹配, 如果给定了$matches参数, 则该参数用来保存搜索结果.除了$flags参数不能接受PCRE_PATTERN_ORDER和PCRE_SET_ORDER来决定顺序外, 其余参数用法和preg_match_all()一致返回$pattern匹配的次数. 它可能是0次(没有匹配)或者1次(因为preg_match()在搜索到一个匹配之后就会停止)当发生错误的时候, 返回false.注意: 如果你仅仅想判断一个字符串是否包含在另外一个字符串中, 不要使用preg_match, 请使用strpos或strstrstring preg_quote(string $str[, string $delimiter = null])对$str中的每一个正则表达式语法定义的特殊字符进行转义. 这通常用于你有一个运行时字符串需要用作正则表达式进行匹配而它又包含特殊的正则表达式字符的时候.特殊的正则表达式字符包括: . / + * ? [ ^ ] $ ( ) { } = ! < > | : -可选的$delimiter参数用来指定额外的需要进行转义的字符, 这通常用于对你的正则表达式分隔符进行转义, 比如通常用作正则表达式分隔符的/mixed preg_replace_callback(mixed $pattern, callback $callback, mixed $subject[, int $limit = -1[, int &$count]])这个函数和preg_replace()的功能相同, 不同点在于$replacement使用了一个回调函数进行自定义的构造, 每一个获取到的对$pattern的完整匹配会对应一次替换, 也就是对$callback的调用, 调用时$callback接受到的参数是所有的子组, 其中第一个参数是第0个子组, 也就是对$pattern的完整匹配. 最终用作替换的字符串是$callback的返回值.其他参数与preg_replace相同.array preg_split(string $pattern, string $subject[, int $limit = -1[, int $flags = 0]])用给定的$pattern分隔字符串形成数组返回.$limit用来限制最终返回的数组的最大长度, 默认-1表示不限制, 0也表示不限制.$flags可以是以下值的组合PREG_SPLIT_NO_EMPTY: 如果此项被设置, 最终返回的数组仅包括分隔之后非空的部分PREG_SPLIT_DELIM_CAPTURE: 如果此项设置, 在$pattern中的括号表达式奖会被捕获并作为返回PREG_SPLIT_OFFSET_CAPTURE: 如果此项设置, 得到的分隔结果中不仅包含分隔后的字符串, 还会包括该子串在原始字符串中的偏移量. (译注: 假设使用”/ab/”分隔字符串”helloabworld”原来返回array(“hello”, “world”)),那么使用此标记后返回array(array(“hello”, 0), array(“world”, 7))注意: 如非必须, 不要使用preg_split, 你可以使用explode()或str_split()替代.pcre/posix函数总结ereg_replace, eregi_replace, preg_replace, preg_replace_callback, preg_filter用来做正则替换ereg, eregi, preg_match, preg_match_all用来做正则匹配split, spliti, preg_split用来做正则分割preg_grep用来做正则查找.模式语法介绍下面描述的是PCRE支持的正则表达式语法和语义. 正则表达式同样在perl文档或其他一些书籍中有所描述, 其中有非常丰富的示例. Jeffrey Friedl的”精通正则表达式”一书非常详细的讨论了这些内容. 这里的描述目的仅作为参考手册.一个正则表达式的模式从左至右不断匹配一个目标字符串. 大多数字符自身就代表一个模式, 并且匹配目标字符串中对应的字符. 作为一个简单的例子The quick brown fox匹配在目标字符串中与其相同的部分. 分隔符当使用PCRE函数的时候, 它要求模式使用闭合的分隔符包裹. 分隔符可以是任意的非字母数字, 非反斜线, 非空的字符.经常用作分隔符的符号有/, #, ~等.如果在模式中需要使用分隔符自身, 就需要通过在前面追加一个反斜线对其进行转义. 如果分隔符经常需要在模式中出现, 那么一个好的选择就是选用另外的字符当做分隔符.preg_quote函数可以用于转义字符串中被用作正则表达式特殊字符的字符, 并且它的第二个参数可以用于指定分隔符同样对其进行转义.除了上面提到的分隔符, 还可以使用括号样式的分隔符, 左括号和右括号分别位于模式字符串的开始和结束位置即可(大括号{}, 中括号[],小括号()都可以)你可以在结束的分隔符后面增加模式修饰符.元字符正则表达式的威力在于它在模式中拥有选择和重复的能力. 这些编码在模式中被称作元字符, 也就是说这些字符不再单纯代表它们自己, 而是赋予了特别的含义.有两种不同的元字符, 一种是可以在方括号外任何地方使用的, 另外一种是在方括号内使用的.方括号外的元字符/ 通常用于字符转义^ 代表目标字符串的开始位置(在多行模式下为行首)$ 代表目标字符串的末尾位置(在多行模式下为行尾). 除了换行符外的任意字符(这是默认情况, 其他意义参见模式修饰符s)[ 字符类定义的开始标记] 字符类定义的结束标记| 开始一个可选分支( 子组开始标记) 子组结束标记? 作为(数)量词(直接位于字符类/子组后面), 代表0个或1个. 位于量词后面, 逆转贪婪模式* 0个或任意多个+ 1个或任意多个{ 自定义量词开始标记} 自定义量词结束标记在中括号内的元字符/ 用于转义字符^ 仅当作为中括号第一个字符时, 表明该字符类取反, 即匹配不在其中罗列的字符- 声明字符范围] 自定义字符类结束反斜线反斜线有多种用法. 首先, 如果它后面紧跟一个非数字字母的字符, 表明取消任何该字符的特殊含义, 进行原文匹配. 这个将反斜线作为转义字符的应用在字符类内部和外部都有效.比如, 如果你想要匹配”*”字符, 你需要在模式中使用”/*”.这适用于一个字符在不进行转义会有特殊含义的情况下. 但是, 对于非数字字母的字符,总是在需要其进行原文匹配的时候在它前面增加一个反斜线, 来声明它代表自己, 这是安全的. 如果要匹配一个反斜线, 那么在模式中使用”//”.注意: 反斜线在单引号字符串和双引号字符串中都有特殊含义, 因此要匹配一个反斜线, 模式中必须写为”////”.译注: “////”,首先它作为字符串, 反斜线会进行转义, 那么转义后的结果是///, 这个才是正则表达式引擎拿到的模式, 而正则表达式引擎也认为/是转义标记, 它会将分隔符/进行转义,从而得到的是一个错误, 因此, 需要4个反斜线才可以匹配一个反斜线.如果一个模式被使用PCRE_EXTENDED选项编译, 模式中的空白字符(除了字符类中的)和未转义的#到行末的所有字符都会被忽略. 要在这种情况下使用空白字符或者#, 就需要对其进行转义.反斜线的第二种用途提供了一种对非打印字符进行可见编码的控制手段. 除了二进制的0会终结一个模式外, 并不会严格的限制非打印字符(自身)的出现, 但是当一个模式以文本编辑器的方式编辑准备的时候, 使用下面的转义序列相比使用二进制字符会更加容易.实际中”/d”写作“\\d”才可以识别(原因不详)/a 响铃字符(十六进制 07)/cx control-x, x是任意字符/e 转义(十六进制1B)/f 换页(十六进制 0C)/n 换行(十六进制 0A)/p{xx} 一个符合xx属性的字符, 详细查看unicode属性/P{xx} 一个不符合xx属性的字符, 详细查看unicode属性/r 回车(十六进制 0D)/t 水平制表符(十六进制 09)/xhh hh十六进制编码的字符, 详细查看unicode属性/ddd ddd八进制编码的字符, 或者后向引用“/cx”的确切效果如下: 如果”x”是一个小写字母, 它被转换为大写. 接着, 将字符的第6位(十六进制 40, 右数第一个位为第0位)取反. 比如”/cz”成为十六进制的1A, “/c{“成为十六进制3B, “/c;”成为十六进制7B.在”/x”后面,读取两个十六进制数(字母可以是大写或小写). 在UTF-8模式, “/x{…}”允许使用, 花括号内的内容是十六进制有效数字. 它将给出的十六进制数字解释为UTF-8字符代码. 原来的十六进制转义序列,/xhh, 匹配一个双字节的UTF-8字符, 如果它的值大于127在”/0”之后, 读取两个八进制数. 所有情况下, 如果数少于2个, 则直接使用. 序列”/0/x/07”指定了两个二进制0紧跟着一个BEL字符. 请确保初始的0之后的两个数字是合法的八进制数.处理一个反斜线紧跟着的不是0的数字的情况比较复杂. 在字符类外部, PCRE读取它并以十进制读取紧随其后的数字. 如果数值小于10,或者之前捕获到了该数字能够代表的左括号(子组), 整个数字序列被认为是后向引用.后向引用如何工作在后面描述, 接下来就会讨论括号子组.在一个字符类里面, 或者十进制数大于9并且没有那么多的子组被捕获, PCRE重新读取反斜线后的第三个8进制数字, 并且从最低的8位生成单字节值. 任何的后续数字都代表它们自身. 例如:/040: 空格的另一种写法/40:当提供了少于40个子组时, 也是空格/7:始终是后向引用/11:可能是后向引用, 也可能是制表符/011:始终是制表符/0113:一个制表符紧跟一个3(因为每次最多只读取3个8进制位)/113:八进制113代表的字符/377: 8进制377是10进制255, 因此代表全1的一个字符/81: 一个后向引用或者一个二进制0紧跟两个数字8和1(因为8不是8进制有效数字)注意, 八进制值的100或者更大的值必须没有前置的0引导, 因为每次最多读取3个8进制位.所有序列定义的单字节值都可以在字符类内部或外部使用. 另外, 在字符类中, 序列”/b”解释为退格字符. 字符类外它又有不同的意义(下面有描述)反斜线的第三种用法是用来描述特定的字符类:/d 任意十进制数位/D 任意非十进制数位/h 任意水平空白字符(PHP 5.2.4)/H 任意非水平空白字符(PHP 5.2.4)/s 任意空白字符/S 任意非空白字符C标准中空白字符有:空格(‘’)、换页(‘\f’)、换行(‘\n’)、回车(‘\r’)、水平制表符(‘\t’)、垂直制表符(‘\v’)六个。

正则表达式语法大全

正则表达式语法大全

正则表达式语法大全前言:一般开发中都会接触到正则表达式,作为一名合格的前端,也应该了解一下正则表达式编写原则,便于自己也能快速编写想要的正则表达式。

1、作用(正则表达式是一种字符串匹配的模式)数据验证:比如电话号码、邮箱等替换文本:快速找到特定文本,用于替换快速提取字符串:基于匹配原则,快速从文档中查找或提取子字符串2、语法(普通字符+特殊字符)普通字符[abc] 匹配[...]的所有字符[^abc] 取反,除了[...]的其他字符[A-Z] 区间字母A到Z.匹配除(\n换行符 \r 回车符)的任何单个字符\s \S 匹配所有,\s所有空白符,包括换行 \S非空白符,不包括换行\w 匹配字母、数字、下划线特殊字符$ 结尾位置(匹配$字符----\$)^ 开始位置(匹配$字符----\^)() 子表达式开始和结束(匹配字符----\( 和 \))* 匹配零次或多次(匹配字符----\*)+匹配一次或多次(匹配字符----\+)匹配零次或一次(匹配字符----\?)| 两项间的一个(匹配字符----\|)限定符{n} n为非负整数,匹配n次{n,} n为非负整数,至少n次{n,m} n为非负整数,n<=m,最少n次,最多m次修饰符i 不区分大小写g 全局匹配m 多行匹配s 特殊字符远点包含换行符3、常用场景•16进制颜色/^#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/以#开始,6或3个字符(A-F、a-f、0-9)结尾•电话号码/^1(3\d|4[5-9]|5[0-35-9]|6[2567]|7[0-8]|8\d|9[0-35-9])\d{8}$/以1开头,3可跟任一数字(\d),4可跟5-9,5可跟0-3或5-9 ,6后2567其中一个,7后是0-8,8后任一数字,9后是0-3或3-5,其余8位是任意数字(\d{8})•身份证号/^[1-9]\d{5}(19|20|21)\d{2}(0[1-9]|10|11|12)(0[1-9]|[1-2]\d|30|31)\d{3}[\dX]$/ 第一位在0-9区间,后面是5位任意数字,4位年份(19、20、21开头,后两位任意),两位代表月份(0开头的1-9或者是10、11、12),两位日期(01-31),三位顺序码,最后一位是校验码,可数字可X•网址/^((https?):)?\/\/([^?:/]+)(:(\d+))?(\/[^?]*)?(\?(.*))?/•邮箱^[A-Za-z0-9-_\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$ 名称有汉字([\ue00-\u9fa5])、字母([a-zA-z])、数字、下划线、中划线,域名有数字、字母、下划线、中划线4、使用方法字符串.match(正则):返回符合的字符串,若不满足返回null字符串.search(正则):返回搜索到的位置,若非一个字符,则返回第一个字母的下标,若不匹配则返回-1字符串.replace(正则,新的字符串):找到符合正则的内容并替换正则.test(字符串):在字符串中查找符合正则的内容,满足则返回true,反之为false说明:new RegExp(规则).test(字符串)和上面写法作用相同。

(个人收集学习笔记)4字符串处理与正则表达式

(个人收集学习笔记)4字符串处理与正则表达式

(个人收集学习笔记)4字符串处理与正则表达式第四章字符串处理与正则表达式一、字符串处理介绍1、如果字符串处理函数和正则表达式都可以实现字符串操作,建议使用字符串处理函数,因为效率高。

2、因为PHP 是弱类型语言,所以其他类型的数据一般都可以直接应用于字符串操作函数里,而自动转换成字符串类型进行处理。

3、还可以将字符串视为数组,或当作字符集合来看待。

$str[0]$str{0}二、常用的字符串输出函数1、echo()函数:使用它的效率要比其他字符串输出函数高。

2、print()函数:功能和echo()一样,但它有返回值,成功返回1,不成功返回0。

3、die()函数:exit()函数的别名。

1)参数如果是字符串,则该函数会在退出前输出它。

2)如果参数是一个整数,这个值会被用做退出状态。

值在0-254之间,退出状态255由PHP 保留,不会使用。

状态0用于成功终止程序。

4、printf():用于输出格式化字符串。

1)例子:printf(“%s age is $d”,$str,$num);2)%d :带符号十进制数%u :无符号十进制数%f :浮点数%s :字符串%b :二进制数%c :依照ASCII 值的字符%%:返回百分比符号%o :八进制数%x :十六进制数(小写字母)%X :十六进制数(大写字母)3)如果%符号多于arg 参数,则必须使用占位符。

占位符被插入到%符号之后,由数字和\$组成。

如:printf(“The %2\$s book contains %1\$d pages.That’s a nice %2\$s full of %1\$d pages”,$num,$str);%2\$s 代表$str 。

5、sprintf()函数:用法和printf()一样,但它不是输出字符串,而是把格式化的字符串以返回值的形式写入到一个变量中。

三、常用的字符串格式化函数字符串的格式化就是将字符串处理为某种特定的格式。

php 匹配字符串的几种方法

php 匹配字符串的几种方法

php 匹配字符串的几种方法
1. 使用字符串函数:使用针对字符串的函数,如 strpos、strstr等,来查找字符串。

这些函数返回匹配字符串的位置或子串,可以用于判断字符串中是否包含指定的字符串或者子串。

2. 使用正则表达式:PHP支持正则表达式,可以使用正则表达式函数来匹配字符串。

可以使用 preg_match、preg_match_all 等函数来查找符合特定模式的字符串。

3. 使用模式匹配函数:PHP提供了许多模式匹配函数,如fnmatch、preg_grep、preg_replace 等,可以用来查找、替换、过滤符合特定模式的字符串。

4. 使用字符串比较函数:使用字符串比较函数,如 strcmp、strcasecmp、strcoll等,可以进行字符串比较,用于比较两个字符串是否相等。

可以利用这些函数来判断字符串是否与预期的字符串相匹配。

如何在PHP中生成随机数

如何在PHP中⽣成随机数⽬录第⼀种⽅法⽤mt_rand()第⼆种⽅法(最快的)第三种取当时时间戳第四种打乱字符串第五种开始创建验证码(直接⽤函数⽣成,⽐较⽅便快捷)php mt_rand⽣成0~1随机⼩数的效果⽐较1.执⾏时间⽐较2.随机效果⽐较3.随机阅读推荐第⼀种⽅法⽤mt_rand()function GetRandStr($length){$str='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';$len=strlen($str)-1;$randstr='';for($i=0;$i<$length;$i++){$num=mt_rand(0,$len);$randstr .= $str[$num];}return $randstr;}$number=GetRandStr(6);echo $number;第⼆种⽅法(最快的)function make_password( $length = 8 ){// 密码字符集,可任意添加你需要的字符$chars = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h','i', 'j', 'k', 'l','m', 'n', 'o', 'p', 'q', 'r', 's','t', 'u', 'v', 'w', 'x', 'y','z', 'A', 'B', 'C', 'D','E', 'F', 'G', 'H', 'I', 'J', 'K', 'L','M', 'N', 'O','P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y','Z','0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!','@','#', '$', '%', '^', '&', '*', '(', ')', '-', '_','[', ']', '{', '}', '<', '>', '~', '`', '+', '=', ',','.', ';', ':', '/', '?', '|');// 在 $chars 中随机取 $length 个数组元素键名$keys = array_rand($chars, $length);$password = '';for($i = 0; $i < $length; $i++){// 将 $length 个数组元素连接成字符串$password .= $chars[$keys[$i]];}return $password;}第三种取当时时间戳function get_password( $length = 8 ){$str = substr(md5(time()), 0, $length);//md5加密,time()当前时间戳return $str;}第四种打乱字符串function getrandstr(){$str='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890';$randStr = str_shuffle($str);//打乱字符串$rands= substr($randStr,0,6);//substr(string,start,length);返回字符串的⼀部分return $rands;}第五种开始创建验证码(直接⽤函数⽣成,⽐较⽅便快捷)$code = rand(10000, 99999);php mt_rand⽣成0~1随机⼩数的效果⽐较lcg_value说明float lcg_value ( void )lcg_value() 返回范围为 (0, 1) 的⼀个伪随机数。

php获取页面class内容的方法

一、介绍在网页开发中,经常需要通过PHP来获取页面中的某个元素的class 内容。

这在一些需要动态生成网页内容或者进行数据处理的情况下非常有用。

本文将介绍如何使用PHP来获取页面中的class内容。

二、使用DOMDocument和DOMXpath1. 需要使用PHP的DOMDocument类来加载网页内容,然后再使用DOMXpath类来查询网页中的元素。

2. 假设需要获取一个网页中id为"content"的div元素的class内容,可以通过以下代码实现:```php$doc = new DOMDocument();$doc->loadHTMLFile('网络协议xxx$xpath = new DOMXpath($doc);$div = $xpath->query('//div[id="content"]');$class = $div->item(0)->getAttribute('class');echo $class;```3. 以上代码首先创建了一个DOMDocument对象,然后使用loadHTMLFile方法加载了网页内容。

接着创建了一个DOMXpath对象,并使用query方法来查询id为"content"的div元素。

最后通过getAttribute方法获取了该元素的class内容并输出。

三、使用正则表达式除了使用DOMDocument和DOMXpath类,还可以使用正则表达式来获取页面中的class内容。

以下是一个简单的示例:```php$html = file_get_contents('网络协议xxxpreg_match('/<div id="content" class="([^"]+)">/', $html, $matches);$class = $matches[1];echo $class;```以上代码使用了file_get_contents函数来获取网页内容,然后使用preg_match函数和正则表达式来匹配id为"content"的div元素的class内容并输出。

PCRE正则表达式语法

PCRE正则表达式语法字符描述\将下⼀个字符标记为⼀个特殊字符,或⼀个原义字符,或⼀个向后引⽤,或⼀个⼋进制转义符。

例如,”\n”匹配⼀个换⾏符。

^匹配输⼊字符串的开始位置。

$匹配输⼊字符串的结束位置。

*匹配前⾯的⼦表达式零次或多次,等价于{0,}+匹配前⾯的⼦表达式⼀次或多次,等价于{1,}?匹配前⾯的⼦表达式零次或⼀次,等价于{0,1}?当该字符紧跟在任何⼀个其他限制符(*,+,?,{n},{n,},{n,m})后⾯时,匹配模式是⾮贪婪的。

⾮贪婪模式尽可能少地匹配所搜索的字符串,⽽默认的贪婪模式则尽可能多地匹配所搜索的字符串。

例如,对于字符串”oooo”,”o+?”将匹配单个”o”,⽽”o+”将匹配所有的”o”。

{n}N是⼀个⾮负整数,匹配确定的n次。

{n,}N是⼀个⾮负整数,⾄少匹配n次。

{n,m}M和n均为⾮负整数,其中n<=m,最少匹配n次且最多匹配m次。

.匹配除”\n”之外的任何单个字符。

要匹配包括”\n”在内的任何字符,请使⽤像”[.\n]”的模式(pattern)匹配pattern并获取这⼀匹配。

(?:pattern)匹配pattern但不获取匹配结果。

这在使⽤“或”字符(|)来组合⼀个模式的各个部分是很有⽤的。

例如:’industry|industries’就可以⽤’industr(?:y|ies)’代替(?=pattern)正向预查,在任何匹配pattern的字符串开始处匹配查找字符串。

例如:”Windows(?=95|98|NT|2000)”能匹配”Windows2000”中的”Windows”,但不能匹配”Windows3.1”中的”Windows”。

(?!pattern)负向预查,在任何不匹配pattern的字符串开始处匹配查找字符串。

例如:”Windows(?!95|98|NT|2000)”能匹配”Windows3.1”中的”Windows”,但不能匹配”Windows2000”中的”Windows”。

preg_match 用法

preg_match是PHP中用于执行正则表达式匹配的函数之一。

它用于检查一个字符串是否与指定的正则表达式模式匹配。

以下是preg_match的基本用法:
php复制代码preg_match(pattern, string, matches);
pattern:正则表达式模式,用于匹配字符串。

string:要执行匹配的目标字符串。

matches:可选参数,用于存储匹配结果。

如果提供了该参数,它将包含与正则表达式模式匹配的部分。

preg_match函数返回匹配结果,如果匹配成功返回1,如果匹配失败返回0,如果没有找到匹配的模式返回false。

以下是一个简单的示例:
php复制代码
$pattern = '/\d+/'; // 匹配一个或多个数字
$string = 'abc123def456';
$result = preg_match($pattern, $string);
if ($result === 1) {
echo'匹配成功';
} elseif ($result === 0) {
echo'没有找到匹配的模式';
} else {
echo'匹配失败';
}
在上述示例中,正则表达式模式\d+用于匹配一个或多个数字。

如果字符串中存在数字,则preg_match返回1,表示匹配成功。

如果没有找到匹配的模式,则返回0。

如果匹配失败,则返回false。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档