以前我一直在回应$ obj-> html,但是当前的项目要求检查HTML,例如{whatever}
,并将其替换为其他内容。
我有两个问题。首先是这段代码比我想要的慢:
class Foo {
function draw_content() {
$slug = "/(?<=\{).*(?=\})/";
if (preg_match($slug, $this->html, $matches)) {
foreach ($matches as $match) {
if (method_exists($this,$match)) {
$replacement = $this->$match();
$this->html = preg_replace("/\{$match\}/", $replacement, $this->html);
}
}
}
return $this->html;
} // fn
function new_releases() {
echo "new release book covers";
} // fn
} // class
有没有更好的方法来获取slug内容?我认为正则表达式会减慢它的速度吗?
第二个问题对我来说很陌生。鉴于此$ obj-&gt; html:
<p class="headline">New Releases</p>
<p>xxx{new_releases}xxxx</p>
$ obj-&gt; draw_content()的处理输出由<?=$obj->draw_content()?>
new release book covers<p class="headline">New Releases</p>
<p>xxxxxxx</p>
为什么new_releases()
输出前置? slu is已经消失,但替换不在它的位置!
答案 0 :(得分:1)
您可以通过以下方式替换您的模式:
$slug = '~{\K[^}]*+(?=})~';
恕我直言,您应该用preg_match
函数替换preg_replace
测试和preg_replace_callback
,尝试这样的事情(并更正错误:)。
function draw_content() {
$slug = '~{([^}]*+)}~';
$that = $this;
$this->html = preg_replace_callback( $slug, function ($m) use ($that) {
if (method_exists($that, $m[1]))
return $that->$m[1]();
return $m[0]; }, $this->html);
return $this->html;
}