首页
关于
Search
1
给你10个市场数据调研报告的免费下载网站!以后竞品数据就从这里找!
182 阅读
2
php接口优化 使用curl_multi_init批量请求
144 阅读
3
《从菜鸟到大师之路 ElasticSearch 篇》
107 阅读
4
2024年备考系统架构设计师
104 阅读
5
PHP 文件I/O
92 阅读
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
登录
Search
标签搜索
php函数
php语法
性能优化
安全
错误和异常处理
问题
vue
Composer
Session
缓存
框架
Swoole
api
并发
异步
正则表达式
php-fpm
mysql 索引
开发规范
协程
dafenqi
累计撰写
786
篇文章
累计收到
28
条评论
首页
栏目
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
副业
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
页面
关于
搜索到
100
篇与
的结果
2023-08-07
使用Composer 管理PHP代码项目
使用Composer 管理PHP代码项目简介Composer 是 PHP 的一个依赖管理工具。它允许你申明项目所依赖的代码库,它会在你的项目中为你安装他们。简介依赖管理声明依赖关系系统要求安装 - *nix下载 Composer 的可执行文件局部安装全局安装全局安装 (on OSX via homebrew)安装 - Windows使用安装程序手动安装使用 Composer自动加载依赖管理Composer 不是一个包管理器。是的,它涉及 "packages" 和 "libraries",但它在每个项目的基础上进行管理,在你项目的某个目录中(例如 vendor)进行安装。默认情况下它不会在全局安装任何东西。因此,这仅仅是一个依赖管理。这种想法并不新鲜,Composer 受到了 node's npm 和 ruby's bundler 的强烈启发。而当时 PHP 下并没有类似的工具。Composer 将这样为你解决问题:a) 你有一个项目依赖于若干个库。b) 其中一些库依赖于其他库。c) 你声明你所依赖的东西。d) Composer 会找出哪个版本的包需要安装,并安装它们(将它们下载到你的项目中)。声明依赖关系比方说,你正在创建一个项目,你需要一个库来做日志记录。你决定使用 monolog。为了将它添加到你的项目中,你所需要做的就是创建一个 composer.json 文件,其中描述了项目的依赖关系。{ "require": { "monolog/monolog": "1.2.*" } }我们只要指出我们的项目需要一些 monolog/monolog 的包,从 1.2 开始的任何版本。系统要求运行 Composer 需要 PHP 5.3.2+ 以上版本。一些敏感的 PHP 设置和编译标志也是必须的,但对于任何不兼容项安装程序都会抛出警告。我们将从包的来源直接安装,而不是简单的下载 zip 文件,你需要 git 、 svn 或者 hg ,这取决于你载入的包所使用的版本管理系统。Composer 是多平台的,我们努力使它在 Windows 、 Linux 以及 OSX 平台上运行的同样出色。安装 - *nix下载 Composer 的可执行文件局部安装要真正获取 Composer,我们需要做两件事。首先安装 Composer (同样的,这意味着它将下载到你的项目中):curl -sS https://getcomposer.org/installer | php注意: 如果上述方法由于某些原因失败了,你还可以通过 php >下载安装器:php -r "readfile('https://getcomposer.org/installer');" | php这将检查一些 PHP 的设置,然后下载 composer.phar 到你的工作目录中。这是 Composer 的二进制文件。这是一个 PHAR 包(PHP 的归档),这是 PHP 的归档格式可以帮助用户在命令行中执行一些操作。你可以通过 --install-dir 选项指定 Composer 的安装目录(它可以是一个绝对或相对路径):curl -sS https://getcomposer.org/installer | php -- --install-dir=bin全局安装你可以将此文件放在任何地方。如果你把它放在系统的 PATH 目录中,你就能在全局访问它。 在类Unix系统中,你甚至可以在使用时不加 php 前缀。你可以执行这些命令让 composer 在你的系统中进行全局调用:curl -sS https://getcomposer.org/installer | php mv composer.phar /usr/local/bin/composer注意: 如果上诉命令因为权限执行失败, 请使用 sudo 再次尝试运行 mv 那行命令。现在只需要运行 composer 命令就可以使用 Composer 而不需要输入 php composer.phar。全局安装 (on OSX via homebrew)Composer 是 homebrew-php 项目的一部分。brew update brew tap josegonzalez/homebrew-php brew tap homebrew/versions brew install php55-intl brew install josegonzalez/php/composer安装 - Windows使用安装程序这是将 Composer 安装在你机器上的最简单的方法。下载并且运行 Composer-Setup.exe,它将安装最新版本的 Composer ,并设置好系统的环境变量,因此你可以在任何目录下直接使用 composer 命令。手动安装设置系统的环境变量 PATH 并运行安装命令下载 composer.phar 文件:C:\Users\username>cd C:\bin C:\bin>php -r "readfile('https://getcomposer.org/installer');" | php注意: 如果收到 readfile 错误提示,请使用 http 链接或者在 php.ini 中开启 php_openssl.dll 。在 composer.phar 同级目录下新建文件 composer.bat :C:\bin>echo @php "%~dp0composer.phar" %*>composer.bat关闭当前的命令行窗口,打开新的命令行窗口进行测试:C:\Users\username>composer -V Composer version 27d8904使用 Composer现在我们将使用 Composer 来安装项目的依赖。如果在当前目录下没有一个 composer.json 文件,请查看基本用法章节。要解决和下载依赖,请执行 install 命令:php composer.phar install如果你进行了全局安装,并且没有 phar 文件在当前目录,请使用下面的命令代替:composer install继续 上面的例子,这里将下载 monolog 到 vendor/monolog/monolog 目录。自动加载除了库的下载,Composer 还准备了一个自动加载文件,它可以加载 Composer 下载的库中所有的类文件。使用它,你只需要将下面这行代码添加到你项目的引导文件中:require 'vendor/autoload.php';现在我们就可以使用 monolog 了!想要学习更多关于 Composer 的知识,请查看“基本用法”章节。基本用法基本用法安装composer.json:项目安装关于 require Key包名称包版本下一个重要版本(波浪号运算符)稳定性安装依赖包composer.lock - 锁文件Packagist自动加载安装安装 Composer,你只需要下载 composer.phar 可执行文件。curl -sS https://getcomposer.org/installer | php详细请查看 简介 章节。要检查 Composer 是否正常工作,只需要通过 php 来执行 PHAR:php composer.phar这将返回给你一个可执行的命令列表。注意: 你也可以仅执行 --check 选项而无需下载 Composer。 要获取更多的信息请使用 --help。curl -sS https://getcomposer.org/installer | php -- --helpcomposer.json:项目安装要开始在你的项目中使用 Composer,你只需要一个 composer.json 文件。该文件包含了项目的依赖和其它的一些元数据。这个 JSON format 是很容易编写的。它允许你定义嵌套结构。关于 require Key第一件事情(并且往往只需要做这一件事),你需要在 composer.json 文件中指定 require key 的值。你只需要简单的告诉 Composer 你的项目需要依赖哪些包。{ "require": { "monolog/monolog": "1.0.*" } }你可以看到, require 需要一个 包名称 (例如 monolog/monolog) 映射到 包版本 (例如 1.0.*) 的对象。包名称包名称由供应商名称和其项目名称构成。通常容易产生相同的项目名称,而供应商名称的存在则很好的解决了命名冲突的问题。它允许两个不同的人创建同样名为 json 的库,而之后它们将被命名为 igorw/json 和 seldaek/json。这里我们需要引入 monolog/monolog,供应商名称与项目的名称相同,对于一个具有唯一名称的项目,我们推荐这么做。它还允许以后在同一个命名空间添加更多的相关项目。如果你维护着一个库,这将使你可以很容易的把它分离成更小的部分。包版本在前面的例子中,我们引入的 monolog 版本指定为 1.0.*。这表示任何从 1.0 开始的开发分支,它将会匹配 1.0.0、1.0.2 或者 1.0.20。版本约束可以用几个不同的方法来指定。名称 实例 描述确切的版本号 1.0.2 你可以指定包的确切版本。范围 >=1.0 >=1.0,<2.0>=1.0,<1.1|>=1.2 通过使用比较操作符可以指定有效的版本范围。有效的运算符:>、>=、<、<=、!=。你可以定义多个范围,用逗号隔开,这将被视为一个逻辑AND处理。一个管道符号|将作为逻辑OR处理。AND 的优先级高于 OR。通配符 1.0. 你可以使用通配符来指定一种模式。1.0.*与>=1.0,<1.1是等效的。赋值运算符 ~1.2 这对于遵循语义化版本号的项目非常有用。~1.2相当于>=1.2,<2.0。想要了解更多,请阅读下一小节。下一个重要版本(波浪号运算符)~ 最好用例子来解释: ~1.2 相当于 >=1.2,<2.0,而 ~1.2.3 相当于 >=1.2.3,<1.3。正如你所看到的这对于遵循 语义化版本号 的项目最有用。一个常见的用法是标记你所依赖的最低版本,像 ~1.2 (允许1.2以上的任何版本,但不包括2.0)。由于理论上直到2.0应该都没有向后兼容性问题,所以效果很好。你还会看到它的另一种用法,使用 ~ 指定最低版本,但允许版本号的最后一位数字上升。注意: 虽然 2.0-beta.1 严格地说是早于 2.0,但是,根据版本约束条件, 例如 ~1.2 却不会安装这个版本。就像前面所讲的 ~1.2 只意味着 .2 部分可以改变,但是 1. 部分是固定的。稳定性默认情况下只有稳定的发行版才会被考虑在内。如果你也想获得 RC、beta、alpha 或 dev 版本,你可以使用 稳定标志。你可以对所有的包做 最小稳定性 设置,而不是每个依赖逐一设置。安装依赖包获取定义的依赖到你的本地项目,只需要调用 composer.phar 运行 install 命令。php composer.phar install接着前面的例子,这将会找到 monolog/monolog 的最新版本,并将它下载到 vendor 目录。 这是一个惯例把第三方的代码到一个指定的目录 vendor。如果是 monolog 将会创建 vendor/monolog/monolog 目录。小技巧: 如果你正在使用Git来管理你的项目, 你可能要添加 vendor 到你的 .gitignore 文件中。 你不会希望将所有的代码都添加到你的版本库中。另一件事是 install 命令将创建一个 composer.lock 文件到你项目的根目录中。composer.lock - 锁文件在安装依赖后,Composer 将把安装时确切的版本号列表写入 composer.lock 文件。这将锁定改项目的特定版本。请提交你应用程序的 composer.lock (包括 composer.json)到你的版本库中这是非常重要的,因为 install 命令将会检查锁文件是否存在,如果存在,它将下载指定的版本(忽略 composer.json 文件中的定义)。这意味着,任何人建立项目都将下载与指定版本完全相同的依赖。你的持续集成服务器、生产环境、你团队中的其他开发人员、每件事、每个人都使用相同的依赖,从而减轻潜在的错误对部署的影响。即使你独自开发项目,在六个月内重新安装项目时,你也可以放心的继续工作,即使从那时起你的依赖已经发布了许多新的版本。如果不存在 composer.lock 文件,Composer 将读取 composer.json 并创建锁文件。这意味着如果你的依赖更新了新的版本,你将不会获得任何更新。此时要更新你的依赖版本请使用 update 命令。这将获取最新匹配的版本(根据你的 composer.json 文件)并将新版本更新进锁文件。php composer.phar update如果只想安装或更新一个依赖,你可以白名单它们:php composer.phar update monolog/monolog [...]注意: 对于库,并不一定建议提交锁文件 请参考:库的锁文件.Packagistpackagist 是 Composer 的主要资源库。 一个 Composer 的库基本上是一个包的源:记录了可以得到包的地方。Packagist 的目标是成为大家使用库资源的中央存储平台。这意味着你可以 require 那里的任何包。当你访问 packagist website (packagist.org),你可以浏览和搜索资源包。任何支持 Composer 的开源项目应该发布自己的包在 packagist 上。虽然并不一定要发布在 packagist 上来使用 Composer,但它使我们的编程生活更加轻松。自动加载对于库的自动加载信息,Composer 生成了一个 vendor/autoload.php 文件。你可以简单的引入这个文件,你会得到一个免费的自动加载支持。require 'vendor/autoload.php';这使得你可以很容易的使用第三方代码。例如:如果你的项目依赖 monolog,你就可以像这样开始使用这个类库,并且他们将被自动加载。$log = new Monolog\Logger('name'); $log->pushHandler(new Monolog\Handler\StreamHandler('app.log', Monolog\Logger::WARNING)); $log->addWarning('Foo');你可以在 composer.json 的 autoload 字段中增加自己的 autoloader。{ "autoload": { "psr-4": {"Acme\": "src/"} } }Composer 将注册一个 PSR-4 autoloader 到 Acme 命名空间。你可以定义一个从命名空间到目录的映射。此时 src 会在你项目的根目录,与 vendor 文件夹同级。例如 src/Foo.php 文件应该包含 Acme\Foo 类。添加 autoload 字段后,你应该再次运行 install 命令来生成 vendor/autoload.php 文件。引用这个文件也将返回 autoloader 的实例,你可以将包含调用的返回值存储在变量中,并添加更多的命名空间。这对于在一个测试套件中自动加载类文件是非常有用的,例如。$loader = require 'vendor/autoload.php'; $loader->add('Acme\Test\', __DIR__);除了 PSR-4 自动加载,classmap 也是支持的。这允许类被自动加载,即使不符合 PSR-0 规范。详细请查看 自动加载-参考。注意: Composer 提供了自己的 autoloader。如果你不想使用它,你可以仅仅引入 vendor/composer/autoload_*.php 文件,它返回一个关联数组,你可以通过这个关联数组配置自己的 autoloader。库(资源包)本章将告诉你如何通过 Composer 来安装你的库。库(资源包)每一个项目都是一个包平台软件包指明版本标签分支别名锁文件发布到 VCS(线上版本控制系统)发布到 packagist每一个项目都是一个包只要你有一个 composer.json 文件在目录中,那么整个目录就是一个包。当你添加一个 require 到项目中,你就是在创建一个依赖于其它库的包。你的项目和库之间唯一的区别是,你的项目是一个没有名字的包。为了使它成为一个可安装的包,你需要给它一个名称。你可以通过 composer.json 中的 name 来定义:{ "name": "acme/hello-world", "require": { "monolog/monolog": "1.0.*" } }在这种情况下项目的名称为 acme/hello-world,其中 acme 是供应商的名称。供应商的名称是必须填写的。注意: 如果你不知道拿什么作为供应商的名称, 那么使用你 github 上的用户名通常是不错的选择。 虽然包名不区分大小写,但惯例是使用小写字母,并用连字符作为单词的分隔。平台软件包Composer 将那些已经安装在系统上,但并不是由 Composer 安装的包视为一个虚拟的平台软件包。这包括PHP本身,PHP扩展和一些系统库。php 表示用户的 PHP 版本要求,你可以对其做出限制。例如 >=5.4.0。如果需要64位版本的 PHP,你可以使用 php-64bit 进行限制。hhvm 代表的是 HHVM(也就是 HipHop Virtual Machine) 运行环境的版本,并且允许你设置一个版本限制,例如,'>=2.3.3'。ext- 可以帮你指定需要的 PHP 扩展(包括核心扩展)。通常 PHP 拓展的版本可以是不一致的,将它们的版本约束为 * 是一个不错的主意。一个 PHP 扩展包的例子:包名可以写成 ext-gd。lib- 允许对 PHP 库的版本进行限制。以下是可供使用的名称:curl、iconv、icu、libxml、openssl、pcre、uuid、xsl。你可以使用 composer show --platform 命令来获取可用的平台软件包的列表。指明版本你需要一些方法来指明自己开发的包的版本,当你在 Packagist 上发布自己的包,它能够从 VCS (git, svn, hg) 的信息推断出包的版本,因此你不必手动指明版本号,并且也不建议这样做。请查看 标签 和 分支 来了解版本号是如何被提取的。如果你想要手动创建并且真的要明确指定它,你只需要添加一个 version 字段:{ "version": "1.0.0" }注意: 你应该尽量避免手动设置版本号,因为标签的值必须与标签名相匹配。标签对于每一个看起来像版本号的标签,都会相应的创建一个包的版本。它应该符合 'X.Y.Z' 或者 'vX.Y.Z' 的形式,-patch、-alpha、-beta 或 -RC 这些后缀是可选的。在后缀之后也可以再跟上一个数字。下面是有效的标签名称的几个例子:1.0.0v1.0.01.10.5-RC1v4.4.4beta2v2.0.0-alphav2.0.4-p1注意: 即使你的标签带有前缀 v, 由于在需要 require 一个版本的约束时是不允许这种前缀的, 因此 v 将被省略(例如标签 V1.0.0 将创建 1.0.0 版本)。分支对于每一个分支,都会相应的创建一个包的开发版本。如果分支名看起来像一个版本号,那么将创建一个如同 {分支名}-dev 的包版本号。例如一个分支 2.0 将产生一个 2.0.x-dev 包版本(加入了 .x 是出于技术的原因,以确保它被识别为一个分支,而 2.0.x 的分支名称也是允许的,它同样会被转换为 2.0.x-dev)。如果分支名看起来不像一个版本号,它将会创建 dev-{分支名} 形式的版本号。例如 master 将产生一个 dev-master的版本号。下面是版本分支名称的一些示例:1.x1.0 (equals 1.0.x)1.1.x注意: 当你安装一个新的版本时,将会自动从它 source 中拉取。 详细请查看 install 命令。别名它表示一个包版本的别名。例如,你可以为 dev-master 设置别名 1.0.x-dev,这样就可以通过 require 1.0.x-dev 来得到 dev-master 版本的包。详细请查看“别名”。锁文件如果你愿意,可以在你的项目中提交 composer.lock 文件。他将帮助你的团队始终针对同一个依赖版本进行测试。任何时候,这个锁文件都只对于你的项目产生影响。如果你不想提交锁文件,并且你正在使用 Git,那么请将它添加到 .gitignore 文件中。发布到 VCS(线上版本控制系统)一旦你有一个包含 composer.json 文件的库存储在线上版本控制系统(例如:Git),你的库就可以被 Composer 所安装。在这个例子中,我们将 acme/hello-world 库发布在 GitHub 上的 github.com/username/hello-world 中。现在测试这个 acme/hello-world 包,我们在本地创建一个新的项目。我们将它命名为 acme/blog。此博客将依赖 acme/hello-world,而后者又依赖 monolog/monolog。我们可以在某处创建一个新的 blog 文件夹来完成它,并且需要包含 composer.json 文件:{ "name": "acme/blog", "require": { "acme/hello-world": "dev-master" } }在这个例子中 name 不是必须的,因为我们并不想将它发布为一个库。在这里为 composer.json 文件添加描述。现在我们需要告诉我们的应用,在哪里可以找到 hello-world 的依赖。为此我们需要在 composer.json 中添加 repositories 来源申明:{ "name": "acme/blog", "repositories": [ { "type": "vcs", "url": "https://github.com/username/hello-world" } ], "require": { "acme/hello-world": "dev-master" } }更多关于包的来源是如何工作的,以及还有什么其他的类型可供选择,请查看资源库。这就是全部了。你现在可以使用 Composer 的 install 命令来安装你的依赖包了!小结: 任何含有 composer.json 的 GIT、SVN、HG 存储库,都可以通过 require 字段指定“包来源”和“声明依赖”来添加到你的项目中。发布到 packagist好的,你现在可以发布你的包了,但你不会希望你的用户每次都这样繁琐的指定包的来源。你可能注意到了另一件事,我们并没有指定 monolog/monolog 的来源。它是怎么工作的?答案是 packagist。Packagist 是 Composer 主要的一个包信息存储库,它默认是启用的。任何在 packagist 上发布的包都可以直接被 Composer 使用。就像 monolog 它被 发布在 packagist 上,我们可以直接使用它,而不必指定任何额外的来源信息。如果我们想与世界分享我们的 hello-world,我们最好将它发布到 packagist 上。这样做是很容易的。你只需要点击那个大大的 "Submit Package" 按钮并注册。接着提交你库的来源地址,此时 packagist 就开始了抓取。一旦完成,你的包将可以提供给任何人使用。
2023年08月07日
11 阅读
0 评论
0 点赞
2023-08-07
php 的正则表达式完全手册
php 的正则表达式完全手册前言正则表达式是烦琐的,但是强大的,学会之后的应用会让你除了提高效率外,会给你带来绝对的成就感。只要认真去阅读这些资料,加上应用的时候进行一定的参考,掌握正则表达式不是问题。索引1._引子2._正则表达式的历史3._正则表达式定义3.1_普通字符3.2_非打印字符3.3_特殊字符3.4_限定符3.5_定位符3.6_选择3.7_后向引用4._各种操作符的运算优先级5._全部符号解释6._部分例子7._正则表达式匹配规则7.1_基本模式匹配7.2_字符簇7.3_确定重复出现引子目前,正则表达式已经在很多软件中得到广泛的应用,包括*nix(Linux, Unix 等) HP 等操作系统,,PHP,C#,Java 等开发环境,以及很多的应用软件中,都可以看到正则表达式的影子。正则表达式的使用,可以通过简单的办法来实现强大的功能。为了简单有效而又不失强大,造成了正则表达式代码的难度较大,学习起来也不是很容易,所以需要付出一些努力才行,入门之后参照一定的参考,使用起来还是比较简单有效的。例子: ^.+@.+\..+$这样的代码曾经多次把我自己给吓退过。可能很多人也是被这样的代码给吓跑的吧。继续阅读本文将让你也可以自由应用这样的代码。注意:这里的第 7 部分跟前面的内容看起来似乎有些重复,目的是把前面表格里的部分重新描述了一次,目的是让这些内容更容易理解。正则表达式的历史正则表达式的“祖先”可以一直上溯至对人类神经系统如何工作的早期研究。Warren McCulloch 和Walter Pitts 这两位神经生理学家研究出一种数学方式来描述这些神经网络。年, 一位叫 Stephen Kleene 的数学家在 McCulloch 和 Pitts 早期工作的基础上,发表了一篇标题为“神经网事件的表示法”的论文,引入了正则表达式的概念。正则表达式就是用来描述他称为“正则集的代数”的表达式,因此采用“正则表达式”这个术语。随后,发现可以将这一工作应用于使用 Ken Thompson 的计算搜索算法的一些早期研究, ThompsonKen是 Unix 的主要发明人。正则表达式的第一个实用应用程序就是 Unix 中的 qed 编辑器。如他们所说,剩下的就是众所周知的历史了。从那时起直至现在正则表达式都是基于文本的编辑器和搜索工具中的一个重要部分。正则表达式定义正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。列目录时,dir .txt 或 ls .txt 中的.txt 就不是一个正则表达式,因为这里与正则式的*的含义是不同的。正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。3.1 普通字符由所有那些未显式指定为元字符的打印和非打印字符组成。这包括所有的大写和小写字母字符,所有数字,所有标点符号以及一些符号。3.2 非打印字符字符 含义\cx 匹配由 x 指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。 的值必须为 A-Z 或 a-z 之x一。否则,将 c 视为一个原义的 'c' 字符。\f 匹配一个换页符。等价于 \x0c 和 \cL。\n 匹配一个换行符。等价于 \x0a 和 \cJ。\r 匹配一个回车符。等价于 \x0d 和 \cM。\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。\S 匹配任何非空白字符。等价于 1。\t 匹配一个制表符。等价于 \x09 和 \cI。\v 匹配一个垂直制表符。等价于 \x0b 和 \cK。3.3 特殊字符所谓特殊字符,就是一些有特殊含义的字符,如上面说的".txt"中的,简单的说就是表示任何字符串的意思。如果要查找文件名中有的文件,则需要对进行转义,即在其前加一个\。ls *.txt。正则表达式有以下特殊字符。特别字符 说明$ 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性, $ 也匹配 '\n' 或 '\r'。则要匹配 $ 字符本身,请使用 \$。( ) 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 ( 和)。匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 *。匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 +。. 匹配除换行符 \n 之外的任何单字符。要匹配 .,请使用 \。[ 标记一个中括号表达式的开始。要匹配 [,请使用 [。? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 ?。\ 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, 'n' 匹配字符 'n'。'\n' 匹配换行符。序列 '\' 匹配 "\",而 '(' 则匹配 "("。^ 匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。要匹配 ^ 字符本身,请使用 ^。{ 标记限定符表达式的开始。要匹配 {,请使用 {。| 指明两项之间的一个选择。要匹配 |,请使用 |。构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与操作符将小的表达式结合在一起来创建更大的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。3.4 限定符限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有*或+或?或{n}或{n,}或{n,m}共 6 种。*、+和?限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个?就可以实现非贪婪或最小匹配。正则表达式的限定符有:字符 描述匹配前面的子表达式零次或多次。例如,zo 能匹配 "z" 以及 "zoo"。 等价于{0,}。匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于{1,}。? 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于{0,1}。{n} n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food"中的两个 o。{n,} n 是一个非负整数。至少匹配 n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood"中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。{n,m} m 和 n 均为非负整数,其中 n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配"fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。3.5 定位符用来描述字符串或单词的边界,^和$分别指字符串的开始与结束,\b 描述单词的前或后边界,\B 表示非单词边界。不能对定位符使用限定符。3.6 选择用圆括号将所有选择项括起来,相邻的选择项之间用|分隔。但用圆括号会有一个副作用,是相关的匹配会被缓存,此时可用?:放在第一个选项前来消除这种副作用。其中?:是非捕获元之一,还有两个非捕获元是?=和?!,这两个还有更多的含义,前者为正向预查,在任何开始匹配圆括号内的正则表达式模式的位置来匹配搜索字符串,后者为负向预查,在任何开始不匹配该正则表达式模式的位置来匹配搜索字符串。3.7 后向引用对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式中从左至右所遇到的内容存储。存储子匹配的缓冲区编号从 1 开始,连续编号直至最大 99 个子表达式。每个缓冲区都可以使用 '\n' 访问,其中 n 为一个标识特定缓冲区的一位或两位十进制数。可以使用非捕获元字符 '?:', '?=', or '?!' 来忽略对相关匹配的保存。各种操作符的运算优先级相同优先级的从左到右进行运算,不同优先级的运算先高后低。各种操作符的优先级从高到低如下:操作符 描述\ 转义符(), (?:), (?=), [] 圆括号和方括号*, +, ?, {n}, {n,}, {n,m} 限定符^, $, \anymetacharacter 位置和顺序| “或”操作全部符号解释字符 描述\ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如,'n' 匹配字符 "n"。'\n' 匹配一个换行符。序列 '\' 匹配 "\" 而 "(" 则匹配 "("。^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置。$ 匹配输入字符串的结束位置。如果设置了 RegExp 对象的 Multiline 属性,$ 也匹配 '\n' 或 '\r' 之前的位置。匹配前面的子表达式零次或多次。例如,zo 能匹配 "z" 以及 "zoo"。 等价于{0,}。匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于{1,}。? 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于{0,1}。{n} n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food"中的两个 o。{n,} n 是一个非负整数。至少匹配 n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood"中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。{n,m} m 和 n 均为非负整数,其中 n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配"fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。? 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。. 匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。(pattern) 匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在 VBScript中使用 SubMatches 集合,在 JScript 中则使用 $0„$9 属性。要匹配圆括号字符,请使用 '(' 或')'。(?:pattern) 匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比'industry|industries' 更简略的表达式。(?=pattern) 正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。(?!pattern) 负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始x|y 匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。[xyz] 字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。2 负值字符集合。匹配未包含的任意字符。例如, '3' 可以匹配 "plain" 中的'p'。[a-z] 字符范围。匹配指定范围内的任意字符。例如,'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。4 负值字符范围。匹配任何不在指定范围内的任意字符。例如,'4' 可以匹配任何不在 'a' 到'z' 范围内的任意字符。\b 匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。\B 匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。\cx 匹配由 x 指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。 的值必须为 A-Z 或 a-z 之x一。否则,将 c 视为一个原义的 'c' 字符。\d 匹配一个数字字符。等价于 [0-9]。\D 匹配一个非数字字符。等价于 5。\f 匹配一个换页符。等价于 \x0c 和 \cL。\n 匹配一个换行符。等价于 \x0a 和 \cJ。\r 匹配一个回车符。等价于 \x0d 和 \cM。\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。\S 匹配任何非空白字符。等价于 6。\t 匹配一个制表符。等价于 \x09 和 \cI。\v 匹配一个垂直制表符。等价于 \x0b 和 \cK。\w 匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。\W 匹配任何非单词字符。等价于 '7'。\xn 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,'\x41' 匹配 "A"。'\x041' 则等价于 '\x04' & "1"。正则表达式中可以使用 ASCII 编码。.\num 匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,'(.)\1' 匹配两个连续的相同字符。\n 标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为向后引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。\nm 标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm 个获得子表达式,则 nm 为向后引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。\nml 如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。\un 匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, \u00A9 匹配版权符号(?)。部分例子正则表达式 说明/\b([a-z]+) \1\b/gi 一个单词连续出现的位置/(\w+)://(8+)(:\d)?(9)/ 将一个 URL 解析为协议、域、端口及相对路径/^(?:Chapter|Section) 1-9{0,1}$/ 定位章节的位置/[-a-z]/ A 至 z 共 26 个字母再加一个-号。/ter\b/ 可匹配 chapter,而不能 terminal/\Bapt/ 可匹配 chapter,而不能 aptitude/Windows(?=95 |98 |NT )/ 可匹配 Windows95 或 Windows98 或 WindowsNT,当找到一个匹配后,从 Windows后面开始进行下一次正则表达式匹配规则7.1 基本模式匹配一切从最基本的开始。模式,是正规表达式最基本的元素,它们是一组描述字符串特征的字符。模式可以很简单,由普通的字符串组成,也可以非常复杂,往往用特殊的字符表示一个范围内的字符、重复出现,或表示上下文。例如:^once这个模式包含一个特殊的字符^,表示该模式只匹配那些以 once 开头的字符串。例如该模式与字符串"once upon a time"匹配,与"There once was a man from NewYork"不匹配。正如如^符号表示开头一样,$符号用来匹配那些以给定模式结尾的字符串。bucket$这个模式与"Who kept all of this cash in a bucket"匹配,与"buckets"不匹配。字符^和$同时使用时,表示精确匹配(字符串与模式一样)。例如:^bucket$只匹配字符串"bucket"。如果一个模式不包括^和$,那么它与任何包含该模式的字符串匹配。例如:模式once与字符串There once was a man from NewYorkWho kept all of his cash in a bucket.是匹配的。在该模式中的字母(o-n-c-e)是字面的字符,也就是说,他们表示该字母本身,数字也是一样的。其他一些稍微复杂的字符,如标点符号和白字符(空格、制表符等),要用到转义序列。所有的转义序列都用反斜杠()打头。制表符的转义序列是:\t。所以如果我们要检测一个字符串是否以制表符开头,可以用这个模式:^\t类似的,用\n 表示“新行”,\r 表示回车。其他的特殊符号,可以用在前面加上反斜杠,如反斜杠本身用\表示,句号.用.表示,以此类推。7.2 字符簇在 INTERNET 的程序中,正规表达式通常用来验证用户的输入。当用户提交一个 FORM 以后,要判断输入的电话号码、地址、EMAIL 地址、信用卡号码等是否有效,用普通的基于字面的字符是不够的。所以要用一种更自由的描述我们要的模式的办法,它就是字符簇。要建立一个表示所有元音字符的字符簇,就把所有的元音字符放在一个方括号里:[AaEeIiOoUu]这个模式与任何元音字符匹配,但只能表示一个字符。用连字号可以表示一个字符的范围,如:[a-z] //匹配所有的小写字母[A-Z] //匹配所有的大写字母[a-zA-Z] //匹配所有的字母[0-9] //匹配所有的数字[0-9.-] //匹配所有的数字,句号和减号[ \f\r\t\n] //匹配所有的白字符同样的,这些也只表示一个字符,这是一个非常重要的。如果要匹配一个由一个小写字母和一位数字组成的字符串,比如"z2"、"t6"或"g7",但不是"ab2"、"r2d3" 或"b52"的话,用这个模式:^a-z$尽管[a-z]代表 26 个字母的范围,但在这里它只能与第一个字符是小写字母的字符串匹配。前面曾经提到^表示字符串的开头,但它还有另外一个含义。当在一组方括号里使用^是,它表示“非”或“排除”的意思,常常用来剔除某个字符。还用前面的例子,我们要求第一个字符不能是数字:^5[0-9]$这个模式与"&5"、"g7"及"-2"是匹配的,但与"12"、"66"是不匹配的。下面是几个排除特定字符的例子:4 //除了小写字母以外的所有字符10 //除了()(/)(^)之外的所有字符11 //除了双引号(")和单引号(')之外的所有字符特殊字符"." (点,句号)在正规表达式中用来表示除了“新行”之外的所有字符。所以模式"^.5$"与任何两个字符的、以数字 5 结尾和以其他非“新行”字符开头的字符串匹配。模式"."可以匹配任何字符串,除了空串和只包括一个“新行”的字符串。PHP 的正规表达式有一些内置的通用字符簇,列表如下:字符簇含义[[:alpha:]] 任何字母[[:digit:]] 任何数字[[:alnum:]] 任何字母和数字[[:space:]] 任何白字符[[:upper:]] 任何大写字母[[:lower:]] 任何小写字母[[:punct:]] 任何标点符号[[:xdigit:]] 任何 16 进制的数字,相当于[0-9a-fA-F]7.3 确定重复出现到现在为止,你已经知道如何去匹配一个字母或数字,但更多的情况下,可能要匹配一个单词或一组数字。一个单词有若干个字母组成,一组数字有若干个单数组成。跟在字符或字符簇后面的花括号({})用来确定前面的内容的重复出现的次数。字符簇 含义^[a-zA-Z_]$ 所有的字母和下划线^[[:alpha:]]{3}$ 所有的 3 个字母的单词^a$ 字母 a^a{4}$ aaaa^a{2,4}$ aa,aaa 或 aaaa^a{1,3}$ a,aa 或 aaa^a{2,}$ 包含多于两个 a 的字符串^a{2,} 如:aardvark 和 aaab,但 apple 不行a{2,} 如:baad 和 aaa,但 Nantucket 不行\t{2} 两个制表符.{2} 所有的两个字符这些例子描述了花括号的三种不同的用法。一个数字,{x}的意思是“前面的字符或字符簇只出现 x 次”;一个数字加逗号,{x,}的意思是“前面的内容出现 x 或更多的次数”;两个用逗号分隔的数字,{x,y}表示“前面的内容至少出现 x 次,但不超过 y 次”。我们可以把模式扩展到更多的单词或数字:^[a-zA-Z0-9_]{1,}$ //所有包含一个以上的字母、数字或下划线的字符串^[0-9]{1,}$ //所有的正数^-{0,1}[0-9]{1,}$ //所有的整数^-{0,1}[0-9]{0,}.{0,1}[0-9]{0,}$ //所有的小数最后一个例子不太好理解,是吗?这么看吧:与所有以一个可选的负号(-{0,1})开头(^)、跟着 0 个或更多的数字([0-9]{0,})、和一个可选的小数点(.{0,1})再跟上 0 个或多个数字([0-9]{0,}),并且没有其他任何东西($)。下面你将知道能够使用的更为简单的方法。特殊字符"?"与{0,1}是相等的,它们都代表着: 个或 1 个前面的内容” “前面的内容是可选的”“0或。所以刚才的例子可以简化为:^-?[0-9]{0,}.?[0-9]{0,}$特殊字符"*"与{0,}是相等的,它们都代表着“0 个或多个前面的内容”。最后,字符"+"与 {1,}是相等的,表示“1 个或多个前面的内容”,所以上面的 4 个例子可以写成:^[a-zA-Z0-9_]+$ //所有包含一个以上的字母、数字或下划线的字符串^[0-9]+$ //所有的正数^-?[0-9]+$ //所有的整数^-?[0-9].?[0-9]$ //所有的小数当然这并不能从技术上降低正规表达式的复杂性,但可以使它们更容易阅读。 \f\n\r\t\v ↩xyz ↩abc ↩a-z ↩0-9 ↩ \f\n\r\t\v ↩A-Za-z0-9_ ↩/: ↩# ↩\/^ ↩\"\' ↩
2023年08月07日
12 阅读
0 评论
0 点赞
2023-08-07
PHP正则表达式教程
PHP正则表达式教程1、入门简介简单的说,正则表达式是一种可以用于模式匹配和替换的强有力的工具,主要用于字符串的模式分割、匹配、查找及替换操作。我们可以在几乎所有的基于UNIX系统的工具中找到正则表达式的身影,例如,vi编辑器,Perl或PHP脚本语言,以及awk或sed shell程序等。此外,象JavaScript这种客户端的脚本语言也提供了对正则表达式的支持。由此可见,正则表达式已经超出了某种语言或某个系统的局限,成为人们广为接受的概念和功能。正则表达式可以让用户通过使用一系列的特殊字符构建匹配模式,然后把匹配模式与数据文件、程序输入以及WEB页面的表单输入等目标对象进行比较,根据比较对象中是否包含匹配模式,执行相应的程序。举例来说,正则表达式的一个最为普遍的应用就是用于验证用户在线输入的邮件地址的格式是否正确。如果通过正则表达式验证用户邮件地址的格式正确,用户所填写的表单信息将会被正常处理;反之,如果用户输入的邮件地址与正则表达的模式不匹配,将会弹出提示信息,要求用户重新输入正确的邮件地址。由此可见正则表达式在WEB应用的逻辑判断中具有举足轻重的作用。使用正则表达式在某些简单的环境下可能效率不高,因此如何更好的使用PHP正则表达式需要综合考虑。2、基本语法在对正则表达式的功能和作用有了初步的了解之后,我们就来具体看一下正则表达式的语法格式。正则表达式的形式一般如下:/love/其中位于“/”定界符之间的部分就是将要在目标对象中进行匹配的模式。用户只要把希望查找匹配对象的模式内容放入“/”定界符之间即可。在对正则表达式的功能和作用有了初步的了解之后,我们就来具体看一下正则表达式的语法格式。 正则表达式的形式一般如下: /love/ 其中位于“/”定界符之间的部分就是将要在目标对象中进行匹配的模式。用户只要把希望查找匹配对象的模式内容放入“/”定界符之间即可。为了能够使用户更加灵活的定制模式内容,正则表达式提供了专门的“元字符”。所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。 较为常用的元字符包括: “+”, “”,以及 “?”。其中,“+”元字符规定其前导字符必须在目标对象中连续出现一次或多次,“”元字符规定其前导字符必须在目标对象中出现零次或连续多次,而“?”元字符规定其前导对象必须在目标对象中连续出现零次或一次。 下面,就让我们来看一下正则表达式元字符的具体应用。 /fo+/ 因为上述正则表达式中包含“+”元字符,表示可以与目标对象中的 “fool”, “fo”, 或者 “football”等在字母f后面连续出现一个或多个字母o的字符串相匹配。 /eg*/ 因为上述正则表达式中包含“*”元字符,表示可以与目标对象中的 “easy”, “ego”, 或者 “egg”等在字母e后面连续出现零个或多个字母g的字符串相匹配。 /Wil?/ 因为上述正则表达式中包含“?”元字符,表示可以与目标对象中的 “Win”, 或者 “Wilson”,等在字母i后面连续出现零个或一个字母l的字符串相匹配。 除了元字符之外,用户还可以精确指定模式在匹配对象中出现的频率。例如, /jim{2,6}/ 上述正则表达式规定字符m可以在匹配对象中连续出现2-6次,因此,上述正则表达式可以同jimmy或jimmmmmy等字符串相匹配。 在对如何使用正则表达式有了初步了解之后,我们来看一下其它几个重要的元字符的使用方式。 \s:用于匹配单个空格符,包括tab键和换行符; \S:用于匹配除单个空格符之外的所有字符; \d:用于匹配从0到9的数字; \w:用于匹配字母,数字或下划线字符; \W:用于匹配所有与\w不匹配的字符; . :用于匹配除换行符之外的所有字符。 (说明:我们可以把\s和\S以及\w和\W看作互为逆运算) 下面,我们就通过实例看一下如何在正则表达式中使用上述元字符。 /\s+/ 上述正则表达式可以用于匹配目标对象中的一个或多个空格字符。 /\d000/ 如果我们手中有一份复杂的财务报表,那么我们可以通过上述正则表达式轻而易举的查找到所有总额达千元的款项。 除了我们以上所介绍的元字符之外,正则表达式中还具有另外一种较为独特的专用字符,即定位符。定位符用于规定匹配模式在目标对象中的出现位置。 较为常用的定位符包括: “^”, “$”, “\b” 以及 “\B”。其中,“^”定位符规定匹配模式必须出现在目标字符串的开头,“$”定位符规定匹配模式必须出现在目标对象的结尾,\b定位符规定匹配模式必须出现在目标字符串的开头或结尾的两个边界之一,而“\B”定位符则规定匹配对象必须位于目标字符串的开头和结尾两个边界之内,即匹配对象既不能作为目标字符串的开头,也不能作为目标字符串的结尾。同样,我们也可以把“^”和“$”以及“\b”和“\B”看作是互为逆运算的两组定位符。举例来说: /^hell/ 因为上述正则表达式中包含“^”定位符,所以可以与目标对象中以 “hell”, “hello”或 “hellhound”开头的字符串相匹配。 /ar$/ 因为上述正则表达式中包含“$”定位符,所以可以与目标对象中以 “car”, “bar”或 “ar” 结尾的字符串相匹配。 /\bbom/ 因为上述正则表达式模式以“\b”定位符开头,所以可以与目标对象中以 “bomb”, 或 “bom”开头的字符串相匹配。 /man\b/ 因为上述正则表达式模式以“\b”定位符结尾,所以可以与目标对象中以 “human”, “woman”或 “man”结尾的字符串相匹配。 为了能够方便用户更加灵活的设定匹配模式,正则表达式允许使用者在匹配模式中指定某一个范围而不局限于具体的字符。例如: /[A-Z]/ 上述正则表达式将会与从A到Z范围内任何一个大写字母相匹配。 /[a-z]/ 上述正则表达式将会与从a到z范围内任何一个小写字母相匹配。 /[0-9]/ 上述正则表达式将会与从0到9范围内任何一个数字相匹配。 /(a-z[0-9])+/ 上述正则表达式将会与任何由字母和数字组成的字符串,如 “aB0” 等相匹配。这里需要提醒用户注意的一点就是可以在正则表达式中使用 “()” 把字符串组合在一起。“()”符号包含的内容必须同时出现在目标对象中。因此,上述正则表达式将无法与诸如 “abc”等的字符串匹配,因为“abc”中的最后一个字符为字母而非数字。 如果我们希望在正则表达式中实现类似编程逻辑中的“或”运算,在多个不同的模式中任选一个进行匹配的话,可以使用管道符 “|”。例如: /to|too|2/ 上述正则表达式将会与目标对象中的 “to”, “too”, 或 “2” 相匹配。 正则表达式中还有一个较为常用的运算符,即否定符 “[^]”。与我们前文所介绍的定位符 “^” 不同,否定符 “[^]”规定目标对象中不能存在模式中所规定的字符串。例如: /1/ 上述字符串将会与目标对象中除A,B,和C之外的任何字符相匹配。一般来说,当“^”出现在 “[]”内时就被视做否定运算符;而当“^”位于“[]”之外,或没有“[]”时,则应当被视做定位符。 最后,当用户需要在正则表达式的模式中加入元字符,并查找其匹配对象时,可以使用转义符“\”。例如: /Th*/ 上述正则表达式将会与目标对象中的“Th*”而非“The”等相匹配。 1> 正则函数php中有两套正则函数,两者功能差不多,分别为:一套是由PCRE(Perl Compatible Regular Expression,意思是Perl兼容正则表达式)库提供的,使用“preg_”为前缀命名的函数;一套是由POSIX(Portable Operating System Interface of Unix)扩展提供的,使用以“ereg_”为前缀命名的函数;(POSIX的正则函数库,自PHP 5.3以后,就不在推荐使用,从PHP6以后,就将被移除);由于POSIX正则即将推出历史舞台,并且PCRE和perl的形式差不多,更利于我们在perl和php之间切换,所以这里重点介绍PCRE正则的使用。在PCRE中,通常将模式表达式(即正则表达式)包含在两个反斜线“/”之间,如“/apple/”。使用PERL兼容规则的函数有:preg_grep()preg_replace_callback()preg_match_all()preg_match()preg_quote()preg_split()preg_replace()函数的具体使用,我们可以通过PHP手册来找到。2> 元字符(Meta-character):为了能够使用户更加灵活的定制模式内容,正则表达式提供了专门的“元字符”。所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。较为常用的元字符包括:“+”, “*”,以及“?”。其前导字符必须在目标对象中出现0次、1次或连续多次;. 用于匹配除换行符之外的所有字符1次;? 其前导匹配对象连续出现0次或1次;其前导匹配对象连续出现1次或多次;| 选择匹配类似PHP中的| (因为这个运算符合是弱类型导致前面最为整体匹配);^ 匹配对象出现在字符串的首部;$ 匹配对象出现在字符串尾部{m} 匹配前一个内容的重复次数为M次;{m,} 匹配前一个内容的重复次数大于等于M次;{m,n} 匹配前一个内容的重复次数M次到N次;( ) 合并整体匹配,并放入内存,可使用\1 \2…依次获取;\b 出现在目标字符串的开头或结尾的两个边界之一,边界可以是空格或者特殊字符;\B 对象必须位于目标字符串的开头和结尾两个边界之内,即匹配对象既不能作为目标字符串的开头,也不能作为目标字符串的结尾;\s:用于匹配单个空格符,包括tab键和换行符,等价于[\f\t\v];\S:用于匹配除单个空格符之外的任何一个字符,2;\d:匹配从0到9的一个数字,等价于[0-9];\D 匹配除数字以外任何一个字符,等价于3;\w:用于匹配一个字母、数字或下划线字符,等价于[0-9a-zA-Z_];\W:用于匹配所有除英文字母、数字和下划线以外任何的一个字符,4;\A 匹配字符串串首的原子\Z 匹配字符串串尾的原子\f 匹配一个换页符等价于 \x0c 或 \cL匹配一个换行符;等价于 \x0a 或 \cJ匹配一个回车符等价于\x0d 或 \cM\t 匹配一个制表符;等价于 \x09\或\cl\v 匹配一个垂直制表符;等价于\x0b或\ck\oNN 匹配一个八进制数字\xNN 匹配一个十六进制数字\cC 匹配一个控制字符为了能够方便用户更加灵活的设定匹配模式,正则表达式允许使用者在匹配模式中指定某一个范围而不局限于具体的字符。例如:/[A-Z]/上述正则表达式将会与从A到Z范围内任何一个大写字母相匹配。/[a-z]/上述正则表达式将会与从a到z范围内任何一个小写字母相匹配。/[0-9]/上述正则表达式将会与从0到9范围内任何一个数字相匹配。/(a-z[0-9])+/上述正则表达式将会与任何由字母和数字组成的字符串,如 “aB0” 等相匹配。\1 提取第一位的属性例如 /^\d{2} ([\W])\d{2}\1\d{4}$/匹配“12-31-2006”、“09/27/1996”、“86 01 4321”等字符串。但上述正则表达式不匹配“12/34-5678”的格式,这是因为模式“[\W]”的结果“/”已经被存储,下个位置“\1”引用时,其匹配模式也是字符“/”。这里需要提醒用户注意的一点就是可以在正则表达式中使用 “()”把字符串组合在一起。“()”符号包含的内容必须同时出现在目标对象中。因此,上述正则表达式将无法与诸如“abc”等的字符串匹配,因为“abc”中的最后一个字符为字母而非数字。如果我们希望在正则表达式中实现类似编程逻辑中的“或”运算,在多个不同的模式中任选一个进行匹配的话,可以使用管道符 “|”。例如:/to|too|2/上述正则表达式将会与目标对象中的 “to”, “too”, 或 “2” 相匹配。正则表达式中还有一个较为常用的运算符,即否定符“[^]”。与我们前文所介绍的定位符 “^” 不同,否定符“[^]”规定目标对象中不能存在模式中所规定的字符串。例如:/1/上述字符串将会与目标对象中除A,B,和C之外的任何字符相匹配。最后,当用户需要在正则表达式的模式中加入元字符,并查找其匹配对象时,可以使用转义字符“\”。例如:/Th*/上述正则表达式将会与目标对象中的“Th*”而非“The”等相匹配。当不需要存储匹配结果时使用非存储模式单元“(?:)”例如 /(?:a|b|c)(D|E|F)\1g/ 将匹配“aEEg”。在一些正则表达式中,使用非存储模式单元是必要的,否则需要改变其后引用的顺序。上例还可以写成/(a|b|c)(C|E|F)\2g/。3> 转义字符\d 包含所有数字[0-9]\D 除所有数字外3\w 包含所有英文字符[a-zA-Z_0-9]\W 除所有英文字符外5\s 包含空白区域如回车、换行、分页等 [\f\n\r]\a alarm,即 BEL 字符(’0)\cx "control-x",其中 x 是任意字符\e escape(’0B)\f 换页符 formfeed(’0C)\n 换行符 newline(’0A)\r 回车符 carriage return(’0D)\t 制表符 tab(’0)\xhh 十六进制代码为 hh 的字符\ddd 八进制代码为 ddd 的字符,或 backreference\d 任一十进制数字\D 任一非十进制数的字符\A 目标的开头(独立于多行模式)\Z 目标的结尾或位于结尾的换行符前(独立于多行模式)\z 目标的结尾(独立于多行模式)\G 目标中的第一个匹配位置……4> 模式修正符(Pattern Modifiers):模式修正符在忽略大小写、匹配多行中使用特别多,掌握了这一个修正符,往往能解决我们遇到的很多问题。i 匹配时忽略大小写,可同时匹配大小写字母;m 将字符串视为多行,当设定了此修正符,行起始(^)和行结束($)除了匹配整个字符串开头和结束外,还分别匹配其中的换行符(\n)的之后和之前;s 将字符串视为单行,换行符做普通字符看待,使“.”匹配任何字符;x 模式中的空白忽略不计U 匹配到最近的字符串,禁止贪婪匹配,只跟踪到最近的一个匹配符并结束,常用在采集程序上的正则表达式;U 模式字符串被当成UTF-8;e 将替换的字符串作为表达使用,只有preg_replace() 使用此修正符,其它 PCRE 函数将忽略之;A 如果设定了此修正符,模式被强制为“anchored”,即强制仅从目标字符串的开头开始匹配;D 如果设定了此修正符,模式中的行结束($)仅匹配目标字符串的结尾。没有此选项时,如果最后一个字符是换行符的话,也会被匹配在里面,如果设定了 m 修正符则忽略此选项;5> 运算顺序运算规则:从左→到右优先级:()( ) 圆括号因为是内存处理所以最高;? + { } 重复匹配内容其次;^ $ \b 边界处理第三;| 条件处理第四;最后按照运算顺序计算匹配。3、使用实例匹配action属性$str ='';preg_match_all("/\s+action=\"(?!http:)(.*?)\"\s/",$str,$arr);print_r($arr);在正则中使用回调函数/**replace some string by callback function*/function callback_replace() {$url = 'http://esfang.house.sina.com.cn';$str = '<form name="bbbb"action="http://www.bac.com/test.php" target="qwerqwerq"><form name="bbbb"action="http.php" target="qwerqwerq">';$str = preg_replace ( '/(?<=\saction=\")(?!http:)(.*?)(?=\"\s)/e','search($url, \1)', $str );echo $str;}function search($url, $match){return $url . '/' . $match;}带断言的正则匹配$match = '';$str = 'xxxxxx.com.cn _fcksavedurl=""">xxxxxx.com.cn"bold font paragraph text';preg_match_all ( '/(?<=<(\w{1})>).*(?=</\1>)/', $str, $match );echo "匹配没有属性的HTML标签中的内容:";print_r ( $match );替换HTML源码中的地址$form_html = preg_replace ('/(?<=\saction=\"|\ssrc=\"|\shref=\")(?!http:|javascript)(.*?)(?=\"\s)/e','add_url($url, \'\1\')', $form_html );1>PHP中可以使用ereg()函数进行模式匹配操作。ereg()函数的使用格式如下:ereg(pattern, string)其中,pattern代表正则表达式的模式,而string则是执行查找替换操作的目标对象。同样是验证邮件地址,使用PHP编写的程序代码如下:< ?phpif (ereg(“^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+”,$email)){echo “Your email address is correct!”;}else{echo “Please try again!”;}?>2>JavaScript1.2中带有一个功能强大的RegExp()对象,可以用来进行正则表达式的匹配操作。其中的test()方法可以检验目标对象中是否包含匹配模式,并相应的返回true或false。我们可以使用JavaScript编写以下脚本,验证用户输入的邮件地址的有效性。 想必很多人都对正则表达式都头疼,今天,我以我的认识,加上网上一些文章,希望用常人都可以理解的表达方式,来和大家分享学习经验。开篇,还是得说说 ^ 和 $ 他们是分别用来匹配字符串的开始和结束,以下分别举例说明:“^The”:开头一定要有”The”字符串;“of despair$”:结尾一定要有”of despair” 的字符串;那么,“^abc$”:就是要求以abc开头和以abc结尾的字符串,实际上是只有abc匹配;“notice”:匹配包含notice的字符串;你可以看见如果你没有用我们提到的两个字符(最后一个例子),就是说模式(正则表达式)可以出现在被检验字符串的任何地方,你没有把他锁定到两边。接着,说说 ‘*’ ‘+’ 和 ‘?’他们用来表示一个字符可以出现的次数或者顺序,他们分别表示:“zero or more”相当于{0,}“one or more”相当于{1,}“zero or one.”相当于{0,1}这里是一些例子:“ab*”:和ab{0,}同义,匹配以a开头,后面可以接0个或者N个b组成的字符串(”a”, “ab”, “abbb”, 等);“ab+”:和ab{1,}同义,同上条一样,但最少要有一个b存在 (”ab” “abbb”等);“ab?”:和ab{0,1}同义,可以没有或者只有一个b;“a?b+$”:匹配以一个或者0个a再加上一个以上的b结尾的字符串。要点:’*’ ‘+’ 和 ‘?’ 只管它前面那个字符。你也可以在大括号里面限制字符出现的个数,比如:“ab{2}”: 要求a后面一定要跟两个b(一个也不能少)(”abb”);“ab{2,}”: 要求a后面一定要有两个或者两个以上b(如”abb” “abbbb” 等);“ab{3,5}”: 要求a后面可以有2-5个b(”abbb”, “abbbb”, or “abbbbb”)。现在我们把一定几个字符放到小括号里,比如:“a(bc)*”: 匹配 a 后面跟0个或者一个”bc”;“a(bc){1,5}”: 一个到5个 “bc”;还有一个字符 ‘|’,相当于OR操作:“hi|hello”: 匹配含有”hi” 或者 “hello” 的字符串;“(b|cd)ef”: 匹配含有 “bef” 或者 “cdef”的字符串;“(a|b)*c”: 匹配含有这样多个(包括0个)a或b,后面跟一个c的字符串;一个点(’.’)可以代表所有的单一字符,不包括”\n”如果,要匹配包括”\n”在内的所有单个字符,怎么办?用’[\n.]’这种模式。“a.[0-9]”: 一个a加一个字符再加一个0到9的数字;“^.{3}$”: 三个任意字符结尾。中括号括住的内容只匹配一个单一的字符“[ab]”: 匹配单个的 a 或者 b ( 和 “a│b” 一样);“[a-d]”: 匹配’a’ 到’d’的单个字符 (和”a│b│c│d” 还有 “[abcd]”效果一样);一般我们都用[a-zA-Z]来指定字符为一个大小写英文:“^[a-zA-Z]”: 匹配以大小写字母开头的字符串;“[0-9]%”: 匹配含有形如 x% 的字符串;“,[a-zA-Z0-9]$”: 匹配以逗号再加一个数字或字母结尾的字符串;你也可以把你不想要得字符列在中括号里,你只需要在总括号里面使用 ’^’作为开头“%6%”:匹配含有两个百分号里面有一个非字母的字符串。要点:^用在中括号开头的时候,就表示排除括号里的字符。为了PHP能够解释,你必须在这些字符面前后加”,并且将一些字符转义。不要忘记在中括号里面的字符是这条规路的例外——在中括号里面,所有的特殊字符,包括(”),都将失去他们的特殊性质,“[*+?{}.]”匹配含有这些字符的字符串。还有,正如regx的手册告诉我们:如果列表里含有’]’,最好把它作为列表里的第一个字符(可能跟在’^’后面)。如果含有’-’,最好把它放在最前面或者最后面,or 或者一个范围的第二个结束点[a-d-0-9]中间的‘-’将有效。看了上面的例子,你对{n,m}应该理解了吧。要注意的是,n和m都不能为负整数,而且n总是小于m。这样,才能最少匹配n次且最多匹配m次,如”p{1,5}”将匹配 “pvpppppp”中的前五个p。下面说说以\开头的\b 书上说他是用来匹配一个单词边界,就是…比如’ve\b’,可以匹配love里的ve而不匹配very里有ve。\B 正好和上面的\b相反。例子我就不举了…..突然想起来…,可以到 http://www.phpv.net/article.php/251 看看其它用\开头的语法好,我们来做个应用:如何构建一个模式来匹配货币数量的输入。构建一个匹配模式去检查输入的信息是否为一个表示money的数字。我们认为一个表示money的数量有四种方式:“10000.00”和“10,000.00”,或者没有小数部分,“10000”and“10,000”。现在让我们开始构建这个匹配模式:^1-9*$这是所变量必须以非0的数字开头,但这也意味着单一的”0″也不能通过测试,以下是解决的方法:^(0|1-9*)$“只有0和不以0开头的数字与之匹配”,我们也可以允许一个负号在数字之前:^(0|-?1-9*)$这就是:0或者一个以0开头且可能有一个负号在前面的数字。好了,现在让我们别那么严谨,允许以0开头。现在让我们放弃负号,因为我们在表示钱币的时候并不需要用到。我们现在指定模式用来匹配小数部分:^[0-9]+(.[0-9]+)?$这暗示匹配的字符串必须最少以一个阿拉伯数字开头。但是注意,在上面模式中“10.”是不匹配的, 只有“10”和“10.2”才可以,你知道为什么吗?^[0-9]+(.[0-9]{2})?$我们上面指定小数点后面必须有两位小数。如果你认为这样太苛刻,你可以改成:^[0-9]+(.[0-9]{1,2})?$这将允许小数点后面有一到两个字符。现在我们加上用来增加可读性的逗号(每隔三位),我们可以这样表示:^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$不要忘记’+’可以被’*’替代如果你想允许空白字符串被输入话,也不要忘记反斜杆’\’在php字符串中可能会出现错误 (很普遍的错误)。现在,我们已经可以确认字符串了,我们现在把所有逗号都去掉str_replace(”,”, “”, $money),然后在把类型看成double然后我们就可以通过他做数学计算了。再来一个:构造检查email的正则表达式在一个完整的email地址中有三个部分:用户名 (在‘@’左边的一切)2.’@’服务器名(就是剩下那部分)用户名可以含有大小写字母阿拉伯数字,句号(’.’)减号(’-’)and下划线’_’),服务器名字也是符合这个规则,当然下划线除外。现在,用户名的开始和结束都不能是句点,服务器也是这样,还有你不能有两个连续的句点他们之间至少存在一个字符。好现在我们来看一下怎么为用户名写一个匹配模式:^[_a-zA-Z0-9-]+$现在还不能允许句号的存在,我们把它加上:^[_a-zA-Z0-9-]+(.[_a-zA-Z0-9-]+)*$上面的意思就是说:以至少一个规范字符(除了.)开头,后面跟着0个或者多个以点开始的字符串。简单化一点, 我们可以用eregi()取代ereg(),eregi()对大小写不敏感, 我们就不需要指定两个范围“a-z”和“A-Z”只需要指定一个就可以了:^[_a-z0-9-]+(.[_a-z0-9-]+)*$后面的服务器名字也是一样,但要去掉下划线:^[a-z0-9-]+(.[a-z0-9-]+)*$好,现在只需要用”@”把两部分连接:^[_a-z0-9-]+(.[_a-z0-9-]+)@[a-z0-9-]+(.[a-z0-9-]+)$这就是完整的email认证匹配模式了,只需要调用:eregi(”^[_a-z0-9-]+(.[_a-z0-9-]+)@[a-z0-9-]+(.[a-z0-9-]+)$”,$eamil)就可以得到是否为email了正则表达式的其他用法提取字符串ereg() and eregi() 有一个特性是允许用户通过正则表达式去提取字符串的一部分(具体用法你可以阅读手册)。比如说,我们想从 path/URL 提取文件名,下面的代码就是你需要:ereg(”(7*)$”, $pathOrUrl, $regs);echo $regs[1];高级的代换ereg_replace() 和 eregi_replace()也是非常有用的,假如我们想把所有的间隔负号都替换成逗号:ereg_replace(”[ \n\r\t]+”, “,”, trim($str));最后,我把另一串检查EMAIL的正则表达式让看文章的你来分析一下:“^[-!#$%&\’*+\\./0-9=?A-Z^_a-z{|}~]+’.’@’.’[-!#$%&\’*+\\/0-9=?A-Z^_a-z{|}~]+\.’.’[-!#$%&\’*+\./0-9=?A-Z^_`a-z{|}~]+$”如果能方便的读懂,那这篇文章的目的就达到了。A-C ↩\f\t\v ↩0-9 ↩0-9a-zA-Z_ ↩a-zA-Z_0-9 ↩a-zA-Z ↩\/ ↩
2023年08月07日
19 阅读
0 评论
0 点赞
2023-08-07
通俗的PHP正则表达式手册
通俗的PHP正则表达式手册第一,让我们看看两个特别的字符:‘^’和‘$’他们是分别用来匹配字符串的开始和结束,以下分别举例说明:"^The": 匹配以 "The"开头的字符串;"of despair$": 匹配以 "of despair" 结尾的字符串;"^abc$": 匹配以abc开头和以abc结尾的字符串,实际上是只有abc与之匹配;"notice": 匹配包含notice的字符串;你可以看见如果你没有用我们提到的两个字符(最后一个例子),就是说模式(正则表达式)可以出现在被检验字符串的任何地方,你没有把他锁定到两边。第二,这里还有几个字符‘*’,‘+’,和‘?’, 他们用来表示一个字符可以出现的次数或者顺序. 他们分别表示:"zero or more", "one or more", and "zero or one." 这里是一些例子:"ab*": 匹配字符串a和0个或者更多b组成的字符串("a", "ab", "abbb", etc.);"ab+": 和上面一样,但最少有一个b ("ab", "abbb", etc.);"ab?":匹配0个或者一个b;"a?b+$": 匹配以一个或者0个a再加上一个以上的b结尾的字符串.第三,在花括号中的逗号,表示‘到’,即前后跟数字, "{n,m}"表示“n到m”。第四,你也可以在大括号{n}里面限制字符出现的个数,比如"ab{2}": 匹配一个a后面跟两个b(一个也不能少)("abb");"ab{2,}": 最少更两个b("abb", "abbbb", etc.);"ab{2,5}": 2-5个b("abbb", "abbbb", or "abbbbb").你还要注意到你必须总是指定 (i.e, "{0,2}", not "{,2}").同样,你必须注意到, '*', '+', 和'?' 分别和以下三个范围标注是一样的,"{0,}", "{1,}", 和 "{0,1}"。第五,现在把一定数量的字符放到小括号(x)里,比如:"a(bc)*": 匹配 a 后面跟0个或者一个"bc";"a(bc){1,5}": 一个到5个 "bc."第六,还有一个字符‘|’相当于OR 操作:"hi│hello": 匹配含有"hi" 或者 "hello" 的 字符串;"(b│cd)ef": 匹配含有 "bef" 或者 "cdef"的字符串;"(a│b)*c": 匹配含有这样 - 多个(包括0个)a或b,后面跟一个c的字符串 的字符串;第七,一个点‘.’可以代表所有的单一字符:"a.[0-9]": 一个a跟一个字符再跟一个数字的 (含有这样一个字符串的字符串将被匹配,以后省略此括号)"^.{3}$": 以三个字符结尾.第八,中括号[xxx]括住的内容只匹配一个单一的字符"[ab]": 匹配单个的 a 或者 b ( 和 "a│b" 一样);"[a-d]": 匹配'a' 到'd'的单个字符 (和"a│b│c│d" 还有 "[abcd]"效果一样);"^[a-zA-Z]": 匹配以字母开头的字符串"[0-9]%": 匹配含有 形如 x% 的字符串",[a-zA-Z0-9]$": 匹配以逗号再加一个数字或字母结尾的字符串第九,也可以把你不想要得字符列在中括号里,你只需要在中括号里面使用'^' 作为开头 (i.e., "%[^a-zA-Z]%" 匹配含有 两个百分号里面有一个非字母 的字符串).第十:注意,"^.[$()│*+?{\"中的字符作为有特殊意义的字符的时候,你必须在这些字符面前加''。在php3中你应该避免在模式的最前面使用\, 比如说,正则表达式 "($│?[0-9]+" 应该这样调用ereg("(\$│?[0-9]+", $str) (不知道php4是不是一样),但不要忘记在中括号里面的字符是这条规路的例外:在中括号里面, 所有的特殊字符,包括'', 都将失去他们的特殊性质(i.e., "[*+?{}.]"匹配含有这些字符的字符串).还有,正如regx的手册告诉我们: "如果列表里含有], 最好把它作为列表里的第一个字符(可能跟在'^'后面)。如果含有-, 最好把它放在最前面或者最后面, 或者一个范围的第二个结束点(i.e. [a-d-0-9]中间的-将有效.十一,为了完整, 我应该涉及到 collating sequences, character classes, 还有 equivalence classes. 但我在这些方面不想讲的太详细, 这些在下面的文章中都不需要涉及到. 你们可以在regex man pages 那里得到更多消息.十二:例子,如何构建一个模式来匹配 货币数量 的输入?构建一个匹配模式去检查输入的信息是否为一个表示money的数字。我们认为一个表示money的数量有四种方式: "10000.00" 和 "10,000.00",或者没有小数部分, "10000" and "10,000". 现在让我们开始构建这个匹配模式:^1-9*$这是说变量必须以非0的数字开头.但这也意味着 单一的 "0" 也不能通过测试. 以下是解决的方法:^(0│1-9*)$"只有0和不以0开头的数字与之匹配",我们也可以允许一个负号再数字之前:^(0│-?1-9*)$这就是: "0 或者 一个以0开头可能有一个负号在前面的数字." 好了, 好了现在让我们别那么严谨,允许以0开头.现在让我们放弃 负号 , 因为我们在表示钱币的时候并不需要用到. 我们现在指定 模式 用来匹配小数部分:^[0-9]+(.[0-9]+)?$这暗示匹配的字符串必须最少以一个阿拉伯数字开头. 但是注意,在上面模式中 "10." 是不匹配的, 只有 "10" 和 "10.2" 才可以. (你知道为什么吗)^[0-9]+(.[0-9]{2})?$我们上面指定小数点后面必须有两位小数.如果你认为这样太苛刻,你可以改成:^[0-9]+(.[0-9]{1,2})?$这将允许小数点后面有一到两个字符. 现在我们加上用来增加可读性的逗号(每隔三位), 我们可以这样表示:^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$不要忘记加号 '+' 可以被乘号 '*' 替代,如果你想允许空白字符串被输入话 (为什么?). 也不要忘记反斜杆 ‘\’,在php字符串中可能会出现错误 (很普遍的错误). 现在,我们已经可以确认字符串了, 我们现在把所有逗号都去掉 str_replace(",", "", $money) 然后在把类型看成 double然后我们就可以通过他做数学计算了.如何构造检查email的正则表达式?我们继续讨论怎么验证一个email地址. 在一个完整的email地址中有三个部分: POP3 用户名 (在 '@' 左边的一切), '@', 服务器名(就是剩下那部分). 用户名可以含有大小写字母阿拉伯数字,句号 ('.'), 减号('-'), 下划线 ('_'). 服务器名字也是符合这个规则,当然下划线除外.现在, 用户名的开始和结束都不能是句点. 服务器也是这样. 还有你不能有两个连续的句点他们之间至少存在一个字符,好现在我们来看一下怎么为用户名写一个匹配模式:^[_a-zA-Z0-9-]+$现在还不能允许句号的存在. 我们把它加上:^[_a-zA-Z0-9-]+(.[_a-zA-Z0-9-]+)*$上面的意思就是说: "以至少一个规范字符(除.意外)开头,后面跟着0个或者多个以点开始的字符串."简单化一点, 我们可以用 eregi()取代 ereg()。eregi()对大小写不敏感, 我们就不需要指定两个范围 "a-z" 和 "A-Z" – 只需要指定一个就可以了:^[_a-z0-9-]+(.[_a-z0-9-]+)*$后面的服务器名字也是一样,但要去掉下划线:^[a-z0-9-]+(.[a-z0-9-]+)*$Done. 现在只需要用”@”把两部分连接:^[_a-z0-9-]+(.[_a-z0-9-]+)@[a-z0-9-]+(.[a-z0-9-]+)$这就是完整的email认证匹配模式了,只需要调用eregi(‘^[_a-z0-9-]+(.[_a-z0-9-]+)@[a-z0-9-]+(.[a-z0-9-]+)$ ’,$eamil)就可以得到是否为email了。提取字符串ereg() and eregi() 有一个特性是允许用户通过正则表达式去提取字符串的一部分(具体用法你可以阅读手册). 比如说,我们想从 path/URL 提取文件名 – 下面的代码就是你需要:ereg("(1*)$", $pathOrUrl, $regs);echo $regs[1];高级的代换ereg_replace() 和 eregi_replace()也是非常有用的: 假如我们想把所有的间隔负号都替换成逗号:ereg_replace("[ \n\r\t]+", ",", trim($str));匹配中文字符的正则表达式: [\u4e00-\u9fa5]评注:匹配中文还真是个头疼的事,有了这个表达式就好办了匹配双字节字符(包括汉字在内):2评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)匹配空白行的正则表达式:\n\s*\r评注:可以用来删除空白行匹配HTML标记的正则表达式:<(\S?)3>.?</\1>|<.? />评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力匹配首尾空白字符的正则表达式:^\s|\s$评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式匹配Email地址的正则表达式:\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)*评注:表单验证时很实用匹配网址URL的正则表达式:[a-zA-z]+://4*评注:网上流传的版本功能很有限,上面这个基本可以满足需求匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^a-zA-Z{4,15}$评注:表单验证时很实用匹配国内电话号码:\d{3}-\d{8}|\d{4}-\d{7}评注:匹配形式如 0511-4405222 或 021-87888822匹配腾讯QQ号:1-9{4,}评注:腾讯QQ号从10000开始匹配中国邮政编码:[1-9]\d{5}(?!\d)评注:中国邮政编码为6位数字匹配身份证:\d{15}|\d{18}评注:中国的身份证为15位或18位匹配ip地址:\d+.\d+.\d+.\d+评注:提取ip地址时有用匹配特定数字:^[1-9]\d*$ //匹配正整数^-[1-9]\d*$ //匹配负整数^-?[1-9]\d*$ //匹配整数^[1-9]\d*|0$ //匹配非负整数(正整数 + 0)^-[1-9]\d*|0$ //匹配非正整数(负整数 + 0)^[1-9]\d.\d|0.\d[1-9]\d$ //匹配正浮点数^-([1-9]\d.\d|0.\d[1-9]\d)$ //匹配负浮点数^-?([1-9]\d.\d|0.\d[1-9]\d|0?.0+|0)$ //匹配浮点数^[1-9]\d.\d|0.\d[1-9]\d|0?.0+|0$ //匹配非负浮点数(正浮点数 + 0)^(-([1-9]\d.\d|0.\d[1-9]\d))|0?.0+|0$ //匹配非正浮点数(负浮点数 + 0)评注:处理大量数据时有用,具体应用时注意修正匹配特定字符串:^[A-Za-z]+$ //匹配由26个英文字母组成的字符串^[A-Z]+$ //匹配由26个英文字母的大写组成的字符串^[a-z]+$ //匹配由26个英文字母的小写组成的字符串^[A-Za-z0-9]+$ //匹配由数字和26个英文字母组成的字符串^\w+$ //匹配由数字、26个英文字母或者下划线组成的字符串匹配文本,这个偶尔比较好用,但是要小心字符中包含\E$str = '[a-z]';$str = preg_replace('/\G[a-z]\E/', '', $str);echo $str; //打印空,全被替换掉了,相关大概就是preg_quote功能给匹配结果命名,这样在匹配结果中就可以用这个名称来获取值$str = 'abc123abc';preg_match('/(?P\d+)/', $str, $arr);echo $arr['num']; //相当于echo $arr[1]仅用于分组的括号,匹配内容不会被变量捕获,有时候需要这样提高执行效率$str = 'abc123abc';preg_match('/abc(?:\d+)/', $str, $arr);echo $arr[1]; //除了$arr[0]外没有$arr[1]了,不会赋予\1插入的好帮手,向前、向后锚点搜索位置,每3位添加一个逗号$str = 'fdfad123456789fdfd';$str = preg_replace('/(?<=\d)(?=(\d{3})+(?!\d))/', ',', $str);echo $str; //打印 fdfad123,456,789fdfd以最少的结果匹配$str = 123456;preg_match('/\d+/', $str, $arr);echo $arr[0]; //是人都知道是123456吧preg_match('/\d+?/', $str, $arr);echo $arr[0]; //这次是1一个比较有用的,可以判断前面的是否有匹配过,比如下边的例子,可以忽略等号右边是否有单引号双引号或者什么都没有$str = <<<HTML]*>/', $str, $arr);print_r($arr);部分模式修饰符,模式修饰符也可以放在表达式中的这里匹配符合XHTML规范的style里的颜色值,大写的STYLE被忽略了,但是里面的color可以大小写无所谓$str = '';preg_match_all('/style=([\'"]?)(?i)color:(\w+)\1(?-i)/', $str, $arr);print_r($arr[2])//也可以把匹配内容放到里面,用:隔开,就不用写结束(?-i)//preg_match_all('/style=([\'"]?)(?i:color:(\w+))\1/', $str, $arr);//再看一例子$str = 'Style';preg_match('/(?i:style)</B>/', $str, $arr);print_r($arr); //可以匹配到$str = 'Style';preg_match('/(?i:style)</B>/', $str, $arr);print_r($arr); //什么都没匹配到单词检索,可惜只能用在英文$str = 'I\'m a teacher';preg_match_all('/\b[a-z]+\b/i', $str, $arr);print_r($arr)u修饰符,按unicode匹配$str = '你您';$str = preg_replace('/[你您]/', 'you', $str);echo $str; //被拆开了,打印4次you//看下面加上u修饰符后的效果,该修饰符需要编码utf-8否则会报错//我的文本都是gb2312,所以要转成utf-8$str = iconv('gb2312', 'utf-8', '你您');$regex = iconv('gb2312', 'utf-8', '/[你您]/u');$str = preg_replace($regex, 'you', $str);echo $str; //打印2次youx模式修饰符,可以忽略空白和加注释$str = 'test Test';preg_match('/test #只匹配小写的test/x', $str, $arr);print_r($arr);排除环视(?<!...) (?!...)、忽略优先 *? +? ?? 的复合使用$str = 'test test1 test2';preg_match('/(?:.(?<!))*</B>/i', $str, $arr);//或者 preg_match('/(?:(?!).)*</B>/i', $str, $arr);print_r($arr)//当时这样写应付不了 $str = 'test test1 test2 test3';//改写一下正则既可 preg_match_all('/(?:(?!</?B>).)*</B>/i', $str, $arr);//根据上面来完成一个最简单的UBB替换$str = 'test [b]test1[b] test2[/b] test3[/b]test';$str = preg_replace('/\[B\]((?:(?!\[\/?B\]).)*)\[\/B\]/i', '<b>\1</b>', $str);$str = preg_replace('/\[B\]((?:(?!\[\/?B\]).)*)\[\/B\]/i', '<b>\1</b>', $str);print_r($str)如果已经确认回朔并不会有匹配结果,可以使用固化分组来放弃备用状态提高效率$str = 'Subject';preg_match('/(\w+):/', $str, $arr);//用以下方法代替//在第一组匹配规则匹配到文本末尾t时匹配结束,启用第二组匹配规则:并不会找到结果,所以这个时候回朔查找,但是\w不会包含:,所以可以直接放弃,preg_match('/(?>\w+):/', $str, $arr);\/ ↩\x00-\xff ↩> ↩\s ↩
2023年08月07日
23 阅读
0 评论
0 点赞
2023-08-07
一个PHP程序员要掌握哪些知识?
一个PHP程序员要掌握哪些知识?本文不但可以作为一个PHP程序员的参考,其它语言的WEB开发者也可以借鉴1.HTML,CSS,JAVASCRIPT是作为一个WEB开发者的基础知识。HTML要学到什么程序呢?本人觉得至少要能与CSS配合完成手写代码排版,虽然现在的网页排版工具一大堆,但不可能100%完美,作为一个专业人士,手写代码是必须的。如何学习CSS?可能大部份人觉得能做得出漂亮精美的网页就自认为自己的CSS水来不错了,其实,CSS不单是一个定义网页的样式,它还是一个行业的标准,在团队合作的环境里,符合标准就显得很重要了。想把自己的CSS水平达到高手级别,建议大家试下用DIV+CSS排版,会大大增长自己的CSS水平。可参考一下 http://www.37dg.com/index.jsp这个页面的源代码,中间那个表格也是用DIV+CSS拼出来的,不知为什么,作者没有把这个页面的CSS代码放在一个独立的文件,正好适合当初者DIV+CSS排版学习。DIV+CSS必须符合标准,必须在FIREFOX和IE下调试过都正常才是正确的。Javascript博大精深,不要小看它,以前有个老外用纯JS写了个《星际争霸》,很是惊人。估计世界上也没几个人能把javascript学到“精通”这个程序。WEB开发者至少能用JS完成基本的验证,和一些版面控制,比如动态增减表格的行,动态移动或改变某些控件的值等。2. AJAX ---- 有经验的程序员都会知道,AJAX不算什么新技术,根本就是JAVASCRIPT+XMLHTTP。现在的人都学会了忽悠,炒炒冷饭也能成为一种新菜式了。不过,我们不用关于这个概念问题,我们会用就行了。在做一些无刷新提交的时候,掌握AJAX是必要的。从底层的角度来看(注意,是从传输的底层角度,我不想因此引起不必要争论),AJAX其实也是在不断的向服务器获取数据库最新信息,只不过是我们的浏览器没有反映出刷新这个效果罢了。AJAXA最有用的地方就是用于表单验证,比如:要验证一个用户注册时输入的用户名是否被使用,以前是必须用户提交后才能验证,用了AJAX就可以在用户输入完成后马上给出验证信息。在程序员眼中看来就像JAVASCRIPT可以直接访问数据库一样。3.XML----XML是比一个HTML更加严格的标准。理论上说XML迟早会代替HTML,但至少短期内无可能的。XML+样式也能做出和HTML同样复杂的页面。但还没有什么支持XML排版的工具。所以就目前而言,XML最大的作用是作为一个数据库的表格来用。比如说,我之前有个项目,是把购物网站定单信息传输给快递公司,但两间不同的公司用的是不同的数据库,无法直接导出导入数据。幸好有了XML,我把所有的数据生成一个XML文件,传给对方后很方便就能导入XML文件。可见,一个行业的标准是多么的重要。XML就胜在可以适应不同的数据库平台,不同的操作系统。4. 数据库, 现在WEB流行的数据库就oracle,MS SQL server,MYSQL,ACCESS等。除了学会所有的SQL查询语句(包括多表联合查询),至少要掌握存储过程,触发器,索引,视图等。很多新手不注意使用索引,我试验过MYSQL,在一个十万条记录的表,(硬盘为FAT32)在有索引和没有索引的情况下,查询速度差了十几倍。另外,数据库的维护和安全很重要,要懂得如何监视数据库的异常,可以参考一下DBA的教程。5。Linux ----现在大型一点的站点都用了linux作为服务器了,所以学习linux是必要的,linux的在网络方面的功能是远远胜于windows. (不过如果只是当作一个普通PC使用,用linux会烦得你要抓狂). 不用学得很深入,基本的linux控制和配置命令就够用了。虽然有些版本的桌面系统做得越来越强大,linux越来越像windows了,不过,如果你不掌握命令行操作,估计你找工作过不了面试的那一关6。服务器,不管用IIS,APACHE,TOMCAT, 各种配置和设定也是必须的。7。PHP------PHPer当然要会PHP了,不废话了,能用面对对象的方式写程序,能将经常要重用的东西写成类,你就合格了,。8。模板引擎-------在今时今日,如何你还未用过MVC的方式写程序,你就OUT了。phplib,smarty是PHP界最有名的模板引擎。个人推荐smarty,因为PHPlib有点老了,用起smarty的标识,好像觉得更合理。9。ADODB---- 如果说一个项目本来是用SQL SERVER的,只需要改一下就能用到MYSQL数据库,是不是很不可思议,不错,ADODB就能完成此功能。可能有人觉得完全没必要,项目做好不可能再更改数据库,那就因需使用吧。至少我个人很喜欢,PHP+MYQL的情况下,ADODB能完成“事务处理”的功能,以前的低版本MYSQL可做不到这点。PHP+MYSQL的架构下,我用ADODB写数据库读写的类,版面就用smarty, ADODB+SMARTY简直就天下无敌。10。英文-----现在去应聘程序员,稍为高薪的,英文读写必须流利。各位programmer不能在这方面翻跟斗了。
2023年08月07日
14 阅读
0 评论
0 点赞
1
...
18
19
20