<?php
function test_regexp($match) {
	$return = array_shift($match);
	#echo "\n";
	#var_export($match);
	#echo "\n";
	$begin = array_shift($match);
	$end = array_pop($match);
	#echo "\n";
	#var_export($match);
	#echo "\n";
	if ( $begin == '[' && $end == ']' ) {
		return substr($return, 1, strlen($return) - 2);
	} else {
		$content = array_pop($match);
		$tag = array_shift($match);
		$attr = array_shift($match);
		#var_dump($begin, $end);
		if ( $content ) {
			return $begin . '{' . $tag . $attr . '}' . $content . '{/' . $tag . '}' . $end;
		} else {
			return $begin . '{' . $tag . $attr . '/}' . $end;
		}
	}
}

$tests = array(
	'[foo]bar[/foo]' => '{foo}bar{/foo}',
	'[foo/]bar[/foo]' => '{foo/}bar[/foo]',
	'[foo/]bar' => '{foo/}bar',
	'[foo]bar' => '{foo/}bar',
	'[foo attr]bar[/foo]' => '{foo attr}bar{/foo}',
	'[foo attr/]bar[/foo]' => '{foo attr/}bar[/foo]',
	'[foo attr/]bar' => '{foo attr/}bar',
	'[foo attr]bar' => '{foo attr/}bar',
	'[[foo]bar[/foo]' => '[{foo}bar{/foo}',
	'[[foo/]bar[/foo]' => '[{foo/}bar[/foo]',
	'[[foo/]bar' => '[{foo/}bar',
	'[[foo]bar' => '[{foo/}bar',
	'[[foo attr]bar[/foo]' => '[{foo attr}bar{/foo}',
	'[[foo attr/]bar[/foo]' => '[{foo attr/}bar[/foo]',
	'[[foo attr/]bar' => '[{foo attr/}bar',
	'[[foo attr]bar' => '[{foo attr/}bar',
	'[foo]bar[/foo]]' => '{foo}bar{/foo}]',
	'[foo/]]bar[/foo]' => '{foo/}]bar[/foo]',
	'[foo/]bar]' => '{foo/}bar]',
	'[foo]]bar' => '{foo/}]bar',
	'[foo attr]bar[/foo]]' => '{foo attr}bar{/foo}]',
	'[foo attr/]]bar[/foo]' => '{foo attr/}]bar[/foo]',
	'[foo attr/]bar]' => '{foo attr/}bar]',
	'[foo attr]]bar' => '{foo attr/}]bar',
	'[[foo]bar[/foo]]' => '[foo]bar[/foo]',
	'[[foo/]]bar[/foo]' => '[foo/]bar[/foo]',
	'[[foo/]]bar' => '[foo/]bar',
	'[[foo]]bar' => '[foo]bar',
	'[[foo attr]bar[/foo]]' => '[foo attr]bar[/foo]',
	'[[foo attr/]]bar[/foo]' => '[foo attr/]bar[/foo]',
	'[[foo attr/]]bar' => '[foo attr/]bar',
	'[[foo attr]]bar' => '[foo attr]bar',
	);

$extras = array_merge(array('' => '', "\n" => "\n", " " => " ", " \n " => " \n "), $tests);

$regexes = array(
	'/(\[?)\[(foo)\b(.*?)(\/)?\](?(4)|(?:((?:(?!\[(?:foo)\b).)+?)\[\/\2\])?)?(\]?)/s' => 'Catch inner / using single inside parenthesis, self-closing shortcode, with look ahead',
	);

header('Content-Type: text/plain');

$i = 0;
foreach ( $regexes as $pattern => $desc ) {
	$i++;
	$j = 0;
	echo "$i. $desc\n\n\"$pattern\"\n\n";

	foreach ( $tests as $test => $test_return ) {
		foreach ( $extras as $extra => $extra_return ) {
			#echo "\n$test$extra:\n";
			$return = preg_replace_callback($pattern, 'test_regexp', "$test$extra");
			#echo "\n";
			if ( $return == "$test_return$extra_return" ) {
				echo "1: $test$extra => $return\n";
				$j++;
			} else {
				echo "0: $test$extra => $return vs. $test_return$extra_return\n";
			}
		}
	}
	echo "\n";
	echo "Total Score: $j";
	echo "\n\n\n";
}
die;
?>