'{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', '[foo]test[foo]test[/foo]test[/foo]' => '{foo}test{foo}test{/foo}test{/foo}', '[foo]test[[foo]test[/foo]]test[/foo]' => '{foo}test[foo]test[/foo]test{/foo}', '[[foo]test[foo]test[/foo]test[/foo]]' => '[foo]test[foo]test[/foo]test[/foo]', '[foo]test[foo/]test[/foo]' => '{foo}test{foo/}test{/foo}', '[foo]test[foo]test[/foo]' => '{foo}test{foo/}test{/foo}', '[foo url="http://example.com"]test[/foo]' => '{foo url="http://example.com"}test{/foo}', '[foo text="some [text] here"]test[/foo]' => '{foo text="some [text] here"}test{/foo}', '[foo text="some [foo/] here"]test[/foo]' => '{foo text="some [foo/] here"}test{/foo}', '[foo text="some [foo] he[/foo]re"]test[/foo]' => '{foo text="some [foo] he[/foo]re"}test{/foo}', '[foo text="some [foo] here"]test[/foo]' => '{foo text="some [foo] here"}test{/foo}', '[foo-foo]bar[/foo-foo]' => '{foo-foo}bar{/foo-foo}', '[foo id="448"]test[/foo][foo id="448"]test[/foo]' => '{foo id="448"}test{/foo}{foo id="448"}test{/foo}' ); class WP_Shortcodes{ private $allowedShortcodes = array('foo','b','u','foo-foo'); private function parseShortcode( $data) { /* $data Array [0] - whole string e.g. `[[foo id="value"]Lorem ipsum[/foo]]` [1/7] - start and end characters e.g. `[` and `]` [2] - the shortcode name e.g. `foo` [3] - attributes e.g. ` id="value"` [4] - the content e.g. `Lorem ipsum` [5] - the shortcode name (self-closing shortcode) [6] - attributes (self-closing shortcode) */ // commented shortcode [[name]] or [[name] content [/name]] if($data[1] == '[' && $data[7] == ']') return substr($data[0], 1, -1); // shortcode with content: [name]content[/name] if(!empty($data[4])) { $r = $data[1].'{'.$data[2].$data[3].'}'.$this->do_shortcode($data[4]).'{/'.$data[2].'}'.$data[7]; } else { // simple shortcode: [name] or [name/] $r = $data[1].'{'.$data[5].$data[6].'/}'.$data[7]; } return $r; } public function do_shortcode($code){ $tagregexp = implode('|',$this->allowedShortcodes); return preg_replace_callback('#(.?)(?:\[('.$tagregexp.')((?:\s|=).*[^\/\]]{1})?\] ( (?: (?(R) [^\[]++ | [^\[]*+) | (?R)) *) \[/\\2\] | \[('.$tagregexp.')((?:\s|=)[^\/\[\]]+?)?\/?\])(.?)#x',array($this, 'parseShortcode'), $code); } } $wpShortcodes = new WP_Shortcodes(); $i=1; $return = ''; foreach($tests as $input => $output) { $testResult = $wpShortcodes -> do_shortcode($input); $return .= '#'.($i).''.$input.''.$testResult.''.$output.''; $i++; } ?>
IDInputResultExpected