note 111936 added to regexp.reference.recursive
| From: | horvath at webarticum dot hu | Date: | Mon, 15 Apr 2013 12:09:16 +0000 |
| Subject: | note 111936 added to regexp.reference.recursive | ||
| Groups: | php.notes | ||
| Request: | Send a blank email to php-notes+get-194477@lists.php.net to get a copy of this message | ||
Below are some reusable patterns. I used comments with the 'x' modifier for
human-readability.
You can write also a function, that generates patterns for specified bracket/quote pairs.
<?php
/* normal paretheses */
$simple_pattern = "( (?#root pattern)
( (?#text or expression)
(?>[^\\(\\)]+) (?#text)
|
\\((?-2)\\) (?#expression and recursion)
)*
)";
$simple_okay_text = "5( 2a + (b - c) ) - a * ( 2b - (c * 3(b - (c + a) ) ) )";
$simple_bad_text = "5( 2)a + (b - c) ) - )a * ( ((2b - (c * 3(b - (c + a) ) ) )";
echo "Simple pattern results:\n";
var_dump(preg_match("/^$simple_pattern\$/x",$simple_okay_text));
var_dump(preg_match("/^$simple_pattern\$/x",$simple_bad_text));
echo "\n----------\n";
/* some brackets */
$full_pattern = "( (?#root pattern)
( (?#text or expression)
(?>[^\\(\\)\\{\\}\\[\\]<>]+) (?#text not contains brackets)
|
(
[\\(\\{\\[<] (?#start bracket)
(?(?<=\\()(?-3)\\)| (?#if normal)
(?(?<=\\{)(?-3)\\}| (?#if coursed)
(?(?<=\\[)(?-3)\\]| (?#if squared)
(?1)\\> (?#else so if tag)
))) (?#close nested-but-logically-the-some-level subpatterns)
)
)*
)";
$full_okay_text = "5( 2a + [b - c] ) - a * ( 2b - {c * 3<b - (c + a) > } )";
$full_bad_text = "5[ 2a + [b - c} ) - a * ( 2b - [c * 3(b - c + a) ) ) }";
echo "Full pattern results:\n";
var_dump(preg_match("/^$full_pattern\$/x",$simple_okay_text));
var_dump(preg_match("/^$full_pattern\$/x",$full_okay_text));
var_dump(preg_match("/^$full_pattern\$/x",$full_bad_text));
echo "\n----------\n";
/* some brackets and quotes */
$extrafull_pattern = "( (?#root pattern)
( (?#text or expression)
(?>[^\\(\\)\\{\\}\\[\\]<>'\"]+) (?#text not contains brackets and quotes)
|
(
([\\(\\{\\[<'\"]) (?#start bracket)
(?(?<=\\()(?-4)\\)| (?#if normal)
(?(?<=\\{)(?-4)\\}| (?#if coursed)
(?(?<=\\[)(?-4)\\]| (?#if squared)
(?(?<=\\<)(?-4)\\>| (?#if tag)
['\"] (?#else so if static)
)))) (?#close nested-but-logically-the-some-level subpatterns)
)
)*
)";
$extrafull_okay_text = "5( 2a + ['b' - c] ) - a * ( 2b - \"{c * 3<b - (c + a)
> }\" )";
$extrafull_bad_text = "5( 2a + ['b' - c] ) - a * ( 2b - \"{c * 3<b - (c + a)
> }\" )";
echo "Extra-full pattern results:\n";
var_dump(preg_match("/^$extrafull_pattern\$/x",$simple_okay_text));
var_dump(preg_match("/^$extrafull_pattern\$/x",$full_okay_text));
var_dump(preg_match("/^$extrafull_pattern\$/x",$extrafull_okay_text));
var_dump(preg_match("/^$extrafull_pattern\$/x",$extrafull_bad_text));
/*
Outputs:
Simple pattern results:
int(0)
int(0)
----------
Full pattern results:
int(0)
int(0)
int(0)
----------
Extra-full pattern results:
int(0)
int(0)
int(0)
int(0)
*/
?>
----
Server IP: 69.147.83.199
Probable Submitter: 86.101.233.13
----
Manual Page -- http://php.net/manual/en/regexp.reference.recursive.php
Edit -- https://master.php.net/note/edit/111936
Del: integrated -- https://master.php.net/note/delete/111936/integrated
Del: useless -- https://master.php.net/note/delete/111936/useless
Del: bad code -- https://master.php.net/note/delete/111936/bad+code
Del: spam -- https://master.php.net/note/delete/111936/spam
Del: non-english -- https://master.php.net/note/delete/111936/non-english
Del: in docs -- https://master.php.net/note/delete/111936/in+docs
Del: other reasons-- https://master.php.net/note/delete/111936
Reject -- https://master.php.net/note/reject/111936
Search -- https://master.php.net/manage/user-notes.php