首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在输入文件解析中使用删除eval()来保护代码段

在输入文件解析中使用删除eval()来保护代码段
EN

Stack Overflow用户
提问于 2012-07-09 09:19:04
回答 2查看 117关注 0票数 0

我有一个模板-esque系统,它可以加载批量模板(在一个文件中有多个模板条目)并相应地存储它们。问题在于,目前的方法使用preg_replace()eval,而且确实容易出错。此错误的示例可能是放置不当的字符,该字符破坏正则表达式并创建解析错误:

代码语言:javascript
复制
Parse error: syntax error, unexpected '<' in tsys.php: eval()'d code

所述加载的代码如下:

代码语言:javascript
复制
// Escaping
$this->_buffer = str_replace( array('\\', '\'', "\n"), array('\\\\', '\\\'', ''), $this->_buffer);

// Regular-expression chunk up the input string to evaluative code
$this->_buffer = preg_replace('#<!--- BEGIN (.*?) -->(.*?)<!--- END (.*?) -->#', "\n" . '$this->_tstack[\'\\1\'] = \'\\2\';', $this->_buffer);

// Run the previously created PHP code
eval($this->_buffer);

此大容量模板的示例文件如下所示:

代码语言:javascript
复制
<!--- BEGIN foo -->
<p>Some HTML code</p>
<!--- END foo -->

<!--- BEGIN bar -->
<h1>Some other HTML code</h1>
<!--- END bar -->

在此输入上运行代码时,将为$this->_tstack提供两个元素:

代码语言:javascript
复制
array (
  'foo' => "<p>Some HTML code</p>",
  'bar' => "<h1>Some other HTML code</h1>",
);

这是预期的行为,但我正在寻找一种方法,我们可以放弃对eval的需求。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-13 15:50:09

好了,来了。给定$template包含:

代码语言:javascript
复制
<!--- BEGIN foo -->
    <p>Some HTML code</p>
<!--- END foo -->

<!--- BEGIN bar -->
    <h1>Some other HTML code</h1>
<!--- END bar -->

然后:

代码语言:javascript
复制
$values = array();
$pattern = '#<!--- BEGIN (?P<key>\S+) -->(?P<value>.+?)<!--- END (?P=key) -->#si';
if ( preg_match_all($pattern, $template, $matches, PREG_SET_ORDER) ) {
    foreach ($matches as $match) {
        $values[$match['key']] = trim($match['value']);
    }
}
var_dump($values);

在以下方面的成果:

代码语言:javascript
复制
array(2) {
  ["foo"]=>
  string(21) "<p>Some HTML code</p>"
  ["bar"]=>
  string(29) "<h1>Some other HTML code</h1>"
}

如果保留空白很重要,请删除trim()__。

票数 1
EN

Stack Overflow用户

发布于 2012-07-09 09:53:34

您可以使用preg_match_all这样做:

代码语言:javascript
复制
// Remove CR and NL
$buffer = str_replace(array("\r", "\n"), '', $this->_buffer);

// Grab interesting parts
$matches = array();
preg_match_all('/\?\?\? BOT (?P<group>[^ ]+) \?\?\?(?P<content>.*)!!! EOT \1 !!!/', $buffer, $matches);

// Build the stack
$stack = array_combine(array_values($matches['group']), array_values($matches['content']));

将产出:

代码语言:javascript
复制
Array
(
    [foo] => <p>Some HTML code</p>
    [bar] => <h1>Some other HTML code</h1>
)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11392181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档