Skip to content
Regular Expression Builder (PHP)
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
components
tests
LICENSE.md
R.php
README.md
examples.php
test.php

README.md

r - Regular Expression Builder (PHP)

r Is a PHP library to build regular expressions.

It is written for PHP 5 and it handles PCRE patterns in a fairly advanced level, but it does not cover the complete specification.

Why?

There are several reasons why one would want build a regular expression with code, rather than to write it down directly:

  • For non-experts, the expression is easier to read
  • It is a handy tool to compose an expression at runtime, depending on different variables and rules
  • There is no need to escape characters, which is always a tricky part
  • No need to look up the syntax of little used constructs: the fluid interface allows for auto completion

Examples

These examples can also be found in the file 'examples.php'.

Full string match

/^Paradise Lost$/

R::expression()
	->startOfString()
	->text('Paradise Lost')
	->endOfString()

Alternate texts

/The (dog|cat)?basket fell off the roof/

R::expression()
	->text('The ')
	->group(
		R::group()->optional()->oneOfThese()->text('dog')->text('cat')
	)
	->text('basket fell off the roof')

Characters

/the [bc]?old man and the [^c]ee.*/

R::expression()
	->text('the ')
	->inChars(R::chars('bc')->optional())
	->text('old man and the ')
	->notInChars(R::chars('c'))
	->text('ee')
	->char(R::anyChar()->zeroOrMore())

Nested groups

/(<a href='([^']*)'>)/

R::expression()
	->group(
		R::group()
			->text("<a href='")
			->group(
				R::group()
					->notInChars(R::chars("'")->zeroOrMore())
			)
			->text("'>")
	)

Assertions

/\bkettle\b/

R::expression()
	->wordBoundary()
	->text('kettle')
	->wordBoundary()

Quantifiers

/[\d]{4}[a-z]{2}/

R::expression()
	->char(R::chars()->digit()->times(4))
	->char(R::chars()->letter()->times(2))

Named blocks, alternate delimiters (#)

#(?P<protocol>http[s]?)://(?P<url>.*)#

R::expression()
	->group(
		R::group('protocol')
			->text('http')
			->char(R::chars('s')->optional())
	)
	->text('://')
	->group(
		R::group('url')
			->char(R::anyChar()->zeroOrMore())
	)

Multiline expression

/^start\s+(^the)\s+show$/m

R::multiLineExpression()
	->startOfStringOrLine()
	->text('start')
	->whitespace()
	->group(
		R::group()->startOfLine()->text('the')
	)
	->whitespace()
	->text('show')
	->endOfStringOrLine()

Look behind, look ahead

/(?<=Lord )(Byron)/

R::expression()
    ->lookBehind(
        R::lookBehind()->text('Lord ')
    )
    ->group(
        R::group()->text('Byron')
    )

The old way is way easier!

Then write parts of the expression in the old style:

#(?P<protocol>https?)://(?P<url>.*)#

R::expression()
	->group(
		R::group('protocol')->raw('https?')
	)
	->text('://')
	->group(
		R::group('url')->raw('.*')
	)

Credits

The credits for the idea of creating a regular expression builder go to VerbalExpressions. It is a fascinating idea and I wanted to see how far it could go. I chose a different type of implementation based on nested fluid interface calls.

You can’t perform that action at this time.