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