This script identifies the "BBCode" (with parameters and values) in a text (online test):
<?php
preg_match_all(
'#\[(link)(.*?)!?\](.*?)\[\/\\1\]#i',
'[link href="http://www.google.com" title="Google" target="_blank"]Google[/link]
[link href="http://www.facebook.com"]Facebook[/link]
[link href=\'http://www.twitter.com\' rel="nofollow"]Twitter[/link]',
$StrMatches
);
/* $StrMatches[0] = Full tag string
* $StrMatches[1] = Tag name
* $StrMatches[2] = tag params string
* $StrMatches[3] = Tag content
* */
print_r($StrMatches);
$ParamList = array();
foreach ($StrMatches[2] as $TagParamStr )
{
preg_match_all('#\s*([^=]+)=[\'|"]([^\'|"]*)[\'|"]#', $TagParamStr, $ParamMatches);
array_push($ParamList, $ParamMatches);
}
/* $ParamList[0] = Full param string
* $ParamList[1] = Param name
* $ParamList[2] = Param value
* */
print_r($ParamList);
Output:
Array
(
[0] => Array
(
[0] => [link href="http://www.google.com" title="Google" target="_blank"]Google[/link]
[3] => [link href="http://www.facebook.com"]Facebook[/link]
[2] => [link href='http://www.twitter.com' rel="nofollow"]Twitter[/link]
)
[1] => Array
(
[0] => link
[1] => link
[2] => link
)
[2] => Array
(
[0] => href="http://www.google.com" title="Google" target="_blank"
[1] => href="http://www.facebook.com"
[2] => href='http://www.twitter.com' rel="nofollow"
)
[3] => Array
(
[0] => Google
[1] => Facebook
[2] => Twitter
)
)
Array
(
[0] => Array
(
[0] => Array
(
[0] => href="http://www.google.com"
[1] => title="Google"
[2] => target="_blank"
)
[1] => Array
(
[0] => href
[1] => title
[2] => target
)
[2] => Array
(
[0] => http://www.google.com
[1] => Google
[2] => _blank
)
)
[1] => Array
(
[0] => Array
(
[0] => href="http://www.facebook.com"
)
[1] => Array
(
[0] => href
)
[2] => Array
(
[0] => http://www.facebook.com
)
)
[2] => Array
(
[0] => Array
(
[0] => href='http://www.twitter.com'
[1] => rel="nofollow"
)
[1] => Array
(
[0] => href
[1] => rel
)
[2] => Array
(
[0] => http://www.twitter.com
[1] => nofollow
)
)
)
The code works fine! but I would like to optimize it with a single RegEx.
How can I make it a unique RegEx?
sorry for my bad English :(