selvinortiz / flux
PHP中的流畅正则表达式。
Requires
- php: >=5.3.0
README
描述
受VerbalExpressions:JS启发,并在很大程度上基于Jesse Luoto的VerbalExpressions:JS,PHP中的流畅正则表达式。
@see 以下为更多信息和灵感及致谢。
需求
- PHP 5.3
- Composer
安装
Flux
通过 package 在 composer 中可用
- require:
"selvinortiz/flux": "dev-master"
- autoload:
require_once 'path/to/vendor/autoload.php'
- namespace:
use SelvinOrtiz\Utils\Flux\Flux;
- 实例化:
$flux = Flux::getInstance();
您还可以克隆/下载此仓库并做您想做的事情:)
@示例
以下简单示例说明了您如何使用 flux
和它的流畅接口来构建复杂模式。
require_once realpath(__DIR__.'/../vendor/autoload.php'); use SelvinOrtiz\Utils\Flux\Flux; use SelvinOrtiz\Utils\Flux\Helper; // The subject string (URL) $str = 'http://www.selvinortiz.com'; // Building the pattern (Fluently) $flux = Flux::getInstance() ->startOfLine() ->find('http') ->maybe('s') ->then('://') ->maybe('www.') ->anythingBut('.') ->either('.co', '.com') ->ignoreCase() ->endOfLine(); // Output the Flux instance Helper::dump( $flux ); // Output the fluently built pattern (@see /src/SelvinOrtiz/Utils/Flux/Helper) Helper::msg( $flux ); // /^(http)(s)?(\:\/\/)(www\.)?([^\.]*)(.co|.com)$/i // Inspect the results Helper::msg( $str ); Helper::msg( $flux->match( $str ) ? 'matched' : 'unmatched' ); Helper::msg( $flux->replace( 'https://$5$6', $str ) );
有关其他示例,请参阅 /etc
目录。
@更新日志
0.5.2
- 添加了
length()
方法,该方法添加或替换了上一个调用中使用的修饰符 - 添加了
getLastSegmentKey()
- 添加了(空的)
Factory
类,用于优化常用模式 - 修复了
phpunit.xml
中的缩进和 EOF - 修复了
README
和示例文件中的注释错误 Pull Request #10
0.5.1
- 添加了
getSegments()
,它未包含在0.5.0
中 Issue #5 - 添加了
removeSegment()
,它也可以用于单元测试 - 添加了
lineBreak()
和br()
,它们匹配新行(DOS/Unix) - 添加了
clear()
,它允许您清除模式并从头开始 - 添加了
getPattern()
,它编译表达式并返回它 - 添加了作为 @todos 的弃用候选者
- 修复了
add()
和raw()
之间的混合逻辑 - 修复了
orTry()
方法的实现 - 将 readme 中的示例移至
changelog
之上 - 改进了单元测试
0.5.0 (Beta)
- 添加了
getSegments()
以提高可测试性 Issue #5 - 添加了 composer 包 selvinortiz/flux
- 添加了
dev
分支 - 添加了贡献说明
- 添加了安装说明
0.4.5
- 修复了内部命名空间冲突
- 将命名空间从
Sortiz\Tools
更改为SelvinOrtiz\Utils\Flux
- 添加了 composer 支持 Issue #3
- 添加了
addSeed()
和removeSeed()
方法 Issue #4 - 添加了
getInstance()
静态方法 - 添加了
FluxUrlExample.php
、FluxDateExample.php
和FluxPhoneExample.php
- 添加了
getSeed()
以获取种子而不强制在对象上使用__toString
- 为模式添加了
getSegment()
方法,用于提取一个段(捕获组) - 实现了单元测试(60%覆盖率)问题 #3
- 实现了完整的
PSR-2
规范(使用制表符而非空格) - 在
match()
和replace()
中启用了seed
问题 #4 - 移除了
example.php
并在其他地方定义它们 - 将示例移动到
/etc
目录下,并且每个文件定义一个示例 - 其他小的修复和添加
0.4.0
- 将
Flux
添加到Sortiz\Tools
命名空间中 - 实现了
PSR-2
规范(使用制表符而非空格) - 更新了
Flux
和此readme文件的版本号 - 在
example.php
中更新了类的实例化,使用完全限定名称 - 添加了对其他已移植
flux
的仓库的引用 - 解决了问题 #3中概述的问题
0.3.0
- 通过
phone/date
示例改进了文档 - 添加了
letters()
方法 - 将
numbers()
方法重命名为digits()
- 为
digits()
添加了对量词的支持 - 添加了
ignoreCase()
并提升其优先级高于inAnyCase()
- 改进了文档化的API
认真考虑将名称更改为FluentX
,有什么想法吗?
0.2.0
- 添加了处理OR情况的
either( $option1, $option2 [, $option3 ...] )
方法 - 更新了此readme文件中的fluent示例
- 添加了许可证
0.1.0 (Alpha)
初始预览版发布
@Todo
- 添加源代码注释
- 添加对量词的支持
- 添加更多高级用例的语言方法
- 添加对已移植
Flux
的仓库的引用 (*) - 添加许可证说明 (*)
- 添加贡献说明 (*)
- 添加致谢 (*)
FLUX API
flux API旨在提供一个流畅的链式对象,用于构建模式。
startOfLine()
添加了行的开始^
修饰符
endOfLine()
添加了行的结束$
修饰符
find( $val ) & then( $val )
允许您通过一个必需的segment
来增强模式,并转义正则表达式字符
maybe( $val )
允许您通过一个可选的segment
来增强模式
any( $val ) & anyOf( $val )
允许您创建一个要匹配的字符集
anything()
向模式添加了一个通配符 (.*)
segment
,但它没有明确地使dotAll()
生效
anythingBut( $val )
将匹配除$val
中字符之外的任何内容,与any()
和anyOf()
相反
br() & lineBreak()
允许您匹配新行(DOS/Unix)
tab()
向模式添加了(\t)
,这将匹配制表符
word()
向模式添加了(\w+)
,这将匹配单个单词
letters( $min=null, $max=null )
仅匹配字母字符,并使用$min
和$max
创建量词
digits( $mix=null, $max=null )
仅匹配数字,并使用$min
和$max
创建与word()
类似的量词
range( $from, $to [, $from, $to ...])
允许您通过调用range('a', 'z', 0, 9)
创建一个range
字符类,如a-z0-9
orTry( $val='' )
允许您创建OR情况(this)|(else)
,并保留捕获顺序以在replace()
中使用
ignoreCase() & inAnyCase()
向模式添加了i
修饰符,这将允许您以不区分大小写的方式匹配
matchNewLine() & dotAll()
向模式添加了s
修饰符,这将允许您在使用anything()
时匹配换行符
multiline()
为模式添加 m
修饰符,允许您在多行中进行搜索
oneLine() & searchOneLine()
如果之前调用了 multiline()
,则移除该修饰符
match( $subject )
简单地接受您的 $subject
,将其与模式进行比较,并返回是否匹配
replace( $replacement, $subject )
您可以使用 $x
格式替换匹配的 segments
,其中 x
是匹配 segment
的 (int)
位置
getPattern()
返回编译后的模式,您也可以在调用 __toString()
的上下文中使用 flux
实例来获取它
clear()
清除创建的 pattern
以及 modifiers
、prefixes
和 suffixes
Flux 其他功能
这是由 James Brooks 编写的 NodeJS Flux 的直接移植,他也是这个项目的合作者。
反馈
这最初是一个周末的实验,但我希望进一步发展,如果您有任何建议,请随时提出!
通过推特 @selvinortiz 与我联系,我们再从那里开始 :)
贡献
- 查找开放的问题或为新功能请求或错误打开一个新问题
- 将此存储库分叉以开始在
dev
分支或分叉中进行更改 - 编写一个测试,以显示错误已被修复或功能按预期工作
- 发送一个拉取请求,并烦扰我,直到我合并它或告诉你 no cigar; )
灵感 & 致谢
该项目受到 VerbalExpressions:JS 的启发,该软件由 Jesse Luoto 开发,他在 2013年7月20日 开始了一个周末项目,该项目在开发者社区中引起了广泛关注,并且该项目已经证明具有很大的潜力。
Flux 不是 VerbalExpressions 的直接移植,但如果您对 PHP 的直接 VerbalExpressions 移植感兴趣,请查看 VerbalExpressions:PHP,由 Mark Wilson 提供
VerbalExpressions 已经移植到 Ruby
、Java
和 Groovy
,截至本更新(2013年7月25日)。
有关创建 flux 的原因以及为什么应该使用它的背景信息,请参阅 问题 #7 以进行讨论。
MIT 许可证
Flux 在 MIT 许可证 下发布,这意味着您可以随意使用它,我不会生气,因为我很善良; )