2010-11-09 53 views
0

在我的文本中,用户可以输入看起来像这样的模块; [[form:contact]],代表模块及其名称; [[module:name]这是替换标签的最佳方式吗?

我使用下面的代码从文本中撤消它,并将其拆分,从我想要的数据库中获取信息并将其替换。

这是最好的方法吗?它工作的很好,但我不确定这是否是最有效的方式,并且想知道你们是否会想到它...

我正在使用Zend Framework。

这是代码:

$start = strpos($this->view->page->text, "[["); 
$end = strpos($this->view->page->text, "]]"); 
$length = $end-$start+2; 

$getModuleTag = substr($this->view->page->text, $start, $length); 
$length = $end-$start-2; 
$removeTags = substr($getModuleTag, 2, $length); 

$split = strpos($removeTags, ":"); 

$GetModuleSort = substr($removeTags, 0, $split); 
$GetModuleName = substr($removeTags, $split+1); 

// Get the wanted data from the database 
switch($GetModuleSort) 
{ 
    case 'form': 
     $this->result = $this->formsService->GetFormByName($GetModuleName); 
     $replaceTag = $this->result->elements; 
    break; 
} 

// TEST OUTPUT 
$final = str_replace($getModuleTag, $replaceTag, $this->view->page->text); 
$this->view->finalOutput = $final; 

回答

0

是的,这是应该做的好方法。

+0

但是,它是否适用于多个模块定义? – AndreKR 2010-11-09 11:19:05

+0

我想不是,我还没有尝试过,但我想通过只添加一个模块来限制用户,这样他们就不能创建充满模块的不合逻辑的杂乱页面,而这些页面之间没有任何关系 – 2010-11-09 11:20:40

+0

然后它就是在性能方面是一个好方法,但是有更少代码的方法。 – AndreKR 2010-11-09 11:23:18

1

你可以使用一个普通expression-根据您的需要:

$pattern="/\[\[(.*?)\]\]/"; 
$string="some string with a [[module]] in it, and [[another]] here"; 
$match=preg_match_all($pattern, $string, $matches); 
print_r($matches); 

会给出所有的模块/标识符数组:

Array ([0] => Array ([0] => [[module]] [1] => [[another]]) [1] => Array ([0] => module [1] => another)) 

第一个子包括提取物作为阵列的孩子与括号(如果您需要这些)第二个孩子包含内容的数组....

这将工作与你想的尽可能多的引用。

+0

奥克,谢谢。事实上,它可以与多个参考一起工作,这对未来很有意义。我想知道的是,哪种方式在性能上更好? – 2010-11-12 15:57:48

相关问题