Of course! Let's break down DedeTagParse in detail. It's a fundamental and powerful function in the DedeCMS (织梦CMS) PHP templating engine.

What is DedeTagParse?
In simple terms, DedeTagParse is the core function responsible for executing and rendering DedeCMS template tags.
When you work with a DedeCMS template (.htm file), you use special tags like {dede:arclist} or {dede:field.title/}. These tags are just placeholders. Before the final HTML page is sent to the user's browser, DedeCMS needs to find these tags, understand what they mean, and replace them with actual data (like a list of articles or the title of the current page).
DedeTagParse is the engine that performs this replacement process. It takes a block of text (your template), finds all the valid Dede tags within it, calls the appropriate PHP functions to get the data for each tag, and then generates the final, fully-rendered HTML.
How It Works: The Core Logic
The function follows a general process:

- Input: It receives a string, which is typically the content of a template file.
- Regular Expression Matching: It uses a regular expression (
preg_replace_callback) to find all occurrences of Dede tags. A Dede tag has this general structure:{dede:tagname attribute='value' ... /}or{dede:tagname attribute='value' ...}...{/dede:tagname} - Callback Function: For every tag it finds, it doesn't replace it directly. Instead, it passes the found tag (e.g., the string
"dede:arclist row='5' titlelen='30'") to a special callback function. - Tag Parsing: Inside the callback function:
- The tag string is parsed to extract the tag name (e.g.,
arclist) and any attributes (e.g.,row='5',titlelen='30'). - Based on the tag name, the callback function determines which PHP function in DedeCMS should handle it. This is usually a function named like
lib_arclist(),lib_channel(), etc. - The callback function calls this handler function, passing the attributes as parameters.
- The handler function queries the database, processes data, and returns the final HTML string that should replace the original tag.
- The tag string is parsed to extract the tag name (e.g.,
- Replacement: The callback function returns this new HTML string to the
preg_replace_callbackfunction, which then replaces the original tag in the template with the generated HTML. - Output: After all tags have been processed,
DedeTagParsereturns the complete, final HTML string ready to be displayed.
Function Signature and Parameters
You will typically find DedeTagParse being called from within the include/dedetemplate.class.php file, specifically within the Display() method of the DedeTemplate class.
Here is a simplified view of its role:
// Inside a DedeTemplate class method...
public function Display() {
// ... load template file into $source ...
// THIS IS THE KEY LINE:
$this->SourceString = $this->DedeTagParse($this->SourceString);
// ... save or echo the final $this->SourceString ...
}
The DedeTagParse function itself usually looks something like this:
/**
* Main function to parse Dede tags
* @param string $source The template string containing the tags
* @return string The parsed HTML string
*/
function DedeTagParse($source) {
// This is a simplified representation. The actual implementation is more complex.
// The regular expression to find Dede tags
$pattern = "/\{dede:([a-zA-Z0-9_]+)(\s+[^}]*)?\}(?:(?!\{\/dede:\\1\}).)*\{\/dede:\\1\}|\{dede:([a-zA-Z0-9_]+)(\s+[^}]*)?\/\}/i";
// Use preg_replace_callback to find all tags and process them
$finalHtml = preg_replace_callback(
$pattern,
// This is the callback function that handles each tag
function($matches) {
// $matches[0] is the full tag string, e.g., "{dede:arclist row='5' /}"
// $matches[1] or $matches[3] will be the tag name, e.g., "arclist"
// The rest of the matches will contain the attributes
$tagName = !empty($matches[1]) ? $matches[1] : $matches[3];
$tagAttributes = $matches[2] ?? $matches[4] ?? '';
// Call the appropriate library function for this tag
// e.g., if $tagName is 'arclist', call lib_arclist()
$functionToCall = 'lib_' . $tagName;
if (function_exists($functionToCall)) {
// Parse attributes and pass them to the function
$attArray = $this->ParseAtt($tagAttributes); // Helper function to parse attributes
return $functionToCall($attArray); // Execute and get the HTML
} else {
// Tag not found, return the original tag or an empty string
return '';
}
},
$source
);
return $finalHtml;
}
Practical Example
Let's trace a real-world example.
Your Template File (index.htm):
<!DOCTYPE html>
<html>
<head>{dede:field.title/}</title>
</head>
<body>
<h1>{dede:field.seotitle/}</h1>
<ul>
{dede:arclist row='5' titlelen='30'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<span>[field:pubdate function="MyDate('Y-m-d',@me)"/]</span>
</li>
{/dede:arclist}
</ul>
</body>
</html>
How DedeTagParse Processes It:
-
Pass 1: Finds
{dede:field.title/}.- Calls
lib_field('title'). lib_field()gets thetitleof the current document from a database variable.- Replaces
{dede:field.title/}with "Welcome to my Site".
- Calls
-
Pass 2: Finds
{dede:field.seotitle/}.- Calls
lib_field('seotitle'). - Replaces it with "My Awesome Website".
- Calls
-
Pass 3: Finds
{dede:arclist row='5' titlelen='30'}...{/dede:arclist}.- This is a block tag. The callback function calls
lib_arclist(['row' => '5', 'titlelen' => '30']). lib_arclist()runs a database query to get the 5 most recent articles.- For each article, it processes the inner tags
[field:arcurl/],[field:title/], and[field:pubdate function="MyDate('Y-m-d',@me)"/]. - It generates a list item (
<li>...</li>) for each article. - It returns a single string containing all 5 list items.
- The entire
{dede:aristle...}block is replaced with this string of list items.
- This is a block tag. The callback function calls
Final HTML Output (Sent to Browser):
<!DOCTYPE html>
<html>
<head>Welcome to my Site</title>
</head>
<body>
<h1>My Awesome Website</h1>
<ul>
<li>
<a href="/article-1.html">This is my first article</a>
<span>2025-10-27</span>
</li>
<li>
<a href="/article-2.html">A second post for you</a>
<span>2025-10-26</span>
</li>
... (3 more list items) ...
</ul>
</body>
</html>
Why is it Important?
- Separation of Concerns: It cleanly separates the presentation layer (HTML templates) from the data/logic layer (PHP code). Designers can work on
.htmfiles without touching PHP, and developers can write logic in PHP files without worrying about HTML structure. - Extensibility: To create a new custom tag, you simply need to:
- Create a PHP function (e.g.,
lib_mycooltag()). - Optionally, register the tag in the system.
- Use
{dede:mycooltag ...}in your templates. TheDedeTagParsesystem will automatically find and use your new function.
- Create a PHP function (e.g.,
- Performance: By using
preg_replace_callback, it efficiently processes all tags in a single pass over the template string, which is much faster than using multiplepreg_replacecalls for each tag type.
Summary
| Feature | Description |
|---|---|
| What it is | The core DedeCMS templating engine that executes {dede:...} tags. |
| How it works | Uses preg_replace_callback to find tags, parse them, call the correct PHP handler function, and replace them with generated HTML. |
| Input | A string containing a DedeCMS template (with tags). |
| Output | A string containing the final, fully-rendered HTML (with tags replaced by data). |
| Key Purpose | To achieve a clean separation between PHP logic and HTML presentation. |
| Developer Role | Primarily used internally by DedeCMS. As a module/theme developer, you create the handler functions (like lib_arclist) that DedeTagParse calls. |
