I want create my own shortcode
In the text i can put the shortcode for example :
The people are very nice , [gal~route~100~100] , the people are very nice , [ga2l~route2~150~150]
In this expression you can see the shortcodes into [ ] tags , i want show the text without this shortcodes and replace it for gallery ( with php include and read the path gallery from shortcode)
I think use this method , as you can see down , but none of them works for me , however people here can tell me something or give me any idea which can help me
<?php
$art_sh_exp=explode("][",html_entity_decode($articulos[descripcion],ENT_QUOTES));
for ($i=0;$i<count($art_sh_exp);$i++) {
$a=array("[","]"); $b=array("","");
$exp=explode("~",str_replace ($a,$b,$art_sh_exp[$i]));
for ($x=0;$x<count($exp);$x++) { print
"".$exp[1]."-".$exp[2]."-".$exp[3]."-<br>"; }
} ?>
Thanks
I suggest you use a regular expression to find all occurrences of your shortcode pattern.
It uses preg_match_all
(documentation here) to find all the occurrences and then simple str_replace
(documentation here) to put the transformed shortcode back in the string
The regular expression contained in this code simply tries to match 0 to unlimited occurences of a character between brackets [
and ]
$string = "The people are very nice , [gal~route~100~100] , the people are very nice , [ga2l~route2~150~150]";
$regex = "/\[(.*?)\]/";
preg_match_all($regex, $string, $matches);
for($i = 0; $i < count($matches[1]); $i++)
{
$match = $matches[1][$i];
$array = explode('~', $match);
$newValue = $array[0] . " - " . $array[1] . " - " . $array[2] . " - " . $array[3];
$string = str_replace($matches[0][$i], $newValue, $string);
}
The resulting string is now
The people are very nice , gal - route - 100 - 100 , the people are very nice , ga2l - route2 - 150 - 150
By breaking the problem in 2 phases
It is simpler to develop and debug. It also makes it easier if you want to change at one point how your shortcodes translate to URLs or whatever.
Edit: as suggested by Jack, using preg_replace_callback would allow to do that simpler. See his answer.
One way to do this is by using preg_replace_callback()
:
function my_replace($match)
{
// $match[0] is e.g. "[gal~route~100~100]"
// $match[1] is e.g. "gal~route~100~100"
// now do whatever you want with the found match
return join('-', explode('~', $match[1])) . '<br />';
}
// apply callback on all patterns like [*]
preg_replace_callback(
'/\[([^]]+)\]/',
'my_replace',
html_entity_decode($articulos[descripcion],ENT_QUOTES)
);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With