Parse Wordpress like Shortcode

前端 未结 6 1767
梦如初夏
梦如初夏 2020-12-15 10:43

I want to parse shortcode like Wordpress with attributes:

Input:

[include file=\"header.html\"]

I need output as array, function na

6条回答
  •  南笙
    南笙 (楼主)
    2020-12-15 11:20

    I also needed this functionality in my PHP framework. This is what I've written, it works pretty well. It works with anonymous functions, which I really like (it's a bit like the callback functions in JavaScript).

    Hello, my name is John an my age is [calc-age day="4" month="10" year="1991"].

    '; $content .= '

    Hello, my name is Carol an my age is [calc-age day="26" month="11" year="1996"].

    '; //The array with all the shortcode handlers. This is just a regular associative array with anonymous functions as values. A very cool new feature in PHP, just like callbacks in JavaScript or delegates in C#. $shortcodes = array( "calc-age" => function($data){ $content = ""; //Calculate the age if(isset($data["day"], $data["month"], $data["year"])){ $age = date("Y") - $data["year"]; if(date("m") < $data["month"]){ $age--; } if(date("m") == $data["month"] && date("d") < $data["day"]){ $age--; } $content = $age; } return $content; } ); //http://stackoverflow.com/questions/18196159/regex-extract-variables-from-shortcode function handleShortcodes($content, $shortcodes){ //Loop through all shortcodes foreach($shortcodes as $key => $function){ $dat = array(); preg_match_all("/\[".$key." (.+?)\]/", $content, $dat); if(count($dat) > 0 && $dat[0] != array() && isset($dat[1])){ $i = 0; $actual_string = $dat[0]; foreach($dat[1] as $temp){ $temp = explode(" ", $temp); $params = array(); foreach ($temp as $d){ list($opt, $val) = explode("=", $d); $params[$opt] = trim($val, '"'); } $content = str_replace($actual_string[$i], $function($params), $content); $i++; } } } return $content; } echo handleShortcodes($content, $shortcodes); ?>

    The result:
    Hello, my name is John an my age is 22.
    Hello, my name is Carol an my age is 17.

提交回复
热议问题