将字符串提取(解析)为片段

时间:2010-12-09 22:36:39

标签: php templates

<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  [{CONTENT:meta}]
  [{CONTENT:title}]
  [{CONTENT:head}]
</head>

[{CONTENT:open_body}]

    <p>[{LOCATION:main_1}]</p>
    <p>[{LOCATION:main_1}]</p>

</body>
</html>

我在"template_file"中拥有上述$string。我试图做一个循环遍历字符串的循环,并在每次迭代给我标签的左侧,标签本身在一个新的变量,然后在另一个字符串的右侧。我不能在这里使用str_replace因为我需要在替换之前提取标签内部的内容。

输出类似于:

$string_left = everything up to a "[{"  
$command = "CONTENT:meta"  
$string_right= everything after the "}]". 

然后我会使用CONTENT:meta处理数据,然后将事物重新组合在一起(string_left + new data + string_right)然后继续执行,直到整个事情被解析。

3 个答案:

答案 0 :(得分:2)

您可以使用相对简单的正则表达式执行此操作:

$inputString = "left part of string [{inner command}] right part of string";


$leftDelim = "\[\{";
$rightDelim = "\}\]";

preg_match("%(.*?)$leftDelim(.*?)$rightDelim(.*)%is", $inputString, $matches);

print_r($matches);

这将演示如何使用正则表达式。 delim变量中的额外斜杠是因为你的分隔符使用正则表达式字符,所以你需要转义它们。

答案 1 :(得分:1)

您可以将preg_replace与匹配[{...}]的正则表达式一起使用,以及使用匹配的“命令”并返回合适的替换字符串的替换函数:

$output = preg_replace('/\[{([^}]*)}\]/e', 'my_replacer(\'$1\')', $string);

定义my_replacer如下:

function my_replacer($command) {
  ...
  return $replacement;
}

答案 2 :(得分:0)

为什么不直接使用模板软件?这是一个很重要的清单。

http://www.webresourcesdepot.com/19-promising-php-template-engines/