2013-04-25 38 views
5

Tôi hiện làm tìm kiếm và thay thế cho một mẫu trang web như thế này:Một cách tốt hơn để làm tìm kiếm này và thay thế cho một mẫu

$template = <<<TEMP 
<html> 
<head> 
<title>[{pageTitle}]</title> 
</head> 
[{menuA}] 
[{menuB}] 
[{bodyContent}] 
</html> 
<<<TEMP; 

Trên đây được đặt trong một file riêng biệt.

Sau đó, tôi làm:

$template = str_replace("[{pageTitle}]",$pageTitle,$template); 
$template = str_replace("[{menuA}]",$menuA,$template); 
$template = str_replace("[{menuB}]",$menuB,$template); 
$template = str_replace("[{bodyContent}]",$bodyContent,$template); 
//Some 10 more similar to the above go here. 
echo $template; 

Vấn đề là, có một số 15 trong tổng số chỉ tương tự như trên.

Có cách nào tốt hơn/sạch hơn/chuyên nghiệp để thực hiện việc này (tìm kiếm và thay thế hoặc làm toàn bộ điều khác nhau). Tôi thấy điều này rất lộn xộn và không chuyên nghiệp.

+3

Làm sạch? Hãy thử xem [Smarty] (http://www.smarty.net/). Nó là một công cụ mẫu PHP. –

Trả lời

3

Có, bạn có thể xác định mảng những thứ bạn muốn thay thế và một mảng khác với những thứ cần thay thế bằng.

$array1 = array("[{pageTitle}]", "[{menuA}]"); 
$array2 = array($pageTitle, $menuA); 

$template = str_replace($array1 , $array2 , $template); 
0

điều gì về việc sử dụng cụm từ thông dụng. giống như bên dưới:

$matches = array(); 
    preg_match_all("/\[\{.*?\}\]/", $template, $matches); 
    foreach ($matches[0] as $match){ 
    // this will replace the '[{','}]' braces as we don't want these in our file name 
    $var = str_replace("[{", "", $match); 
    $var = str_replace("}]", "", $var); 
    // this should pull in the file name and continue the output 
    $template = str_replace($match, $$var, $template); 
    } 

Tôi chưa thử nghiệm nhưng theo cách này bạn sẽ không phải biết mình cần thay thế cái gì? Nó sẽ thay thế những gì trong các thẻ [{text}] của bạn bằng $ text chẳng hạn?

1

Cách tốt nhất là sử dụng thư viện hiện có như Smarty hoặc Twig.

Nếu bạn muốn cuộn giải pháp khuôn mẫu riêng của bạn, bạn có thể sử dụng biểu thức thông thường:

// Just an example array 
$values = array('pageTitle' => 'foo', 'menuA' => 'bar'); 
$offset = 0; 
while(preg_match('/\[\{([a-zA-Z]+)\]\}/', $template, $matches, 
    PREG_OFFSET_CAPTURE, $offset)) { 
    $varname = $matches[0][3]; 
    $value = isset($values[$varname]) ? $values[$varname] : "Not found!"; 
    $template = str_replace('[{'.$varname.'}]', $value, $template); 
    $offset = $matches[1]; 
} 

Nếu bạn không thích các mảng kết hợp, bạn có thể làm điều này thay vì:

$value = isset($$varname)? $$varname : "Not found"; 

Nhưng tôi 'd khuyên chống lại điều đó bởi vì nó có thể phơi bày biến mà bạn không muốn bị phơi bày.

1

Không phát minh lại bánh xe, sử dụng các công cụ mẫu hiện có. Tôi đề nghị twig, bởi vì nó đơn giản và nhanh chóng!

0

tôi đã tìm ra rằng một cái gì đó như thế này thực sự hoạt động:

$foo = 'bar'; 
    $baz = 'foo'; 

    $test = 'Test [{foo}] and [{baz}]'; 

    $test1 = preg_replace("/\[{(.*?)}\]/e", "$$1", $test); 
    $test2 = preg_replace_callback("/\[{(.*?)}\]/", function($v) use($foo, $baz) 
      { 
       return ${$v[1]}; 
      }, $test); 
    var_dump($test1); //string 'Test bar and foo' (length=16) 
    var_dump($test2); //string 'Test bar and foo' (length=16) 

Vì vậy, trong trường hợp của bạn:

$template= preg_replace("/\[{(.*?)}\]/e", "$$1", $template); 

Edit:

Bạn cũng có thể chekck nếu biến được thiết lập như thế này:

$foo = 'bar'; 
    $baz = 'foo'; 

    $test = 'Test [{foo}] and [{baz}] or [{ble}]'; 

    $test1 = preg_replace("/\[{(.*?)}\]/e", "isset($$1) ? $$1 : '$$1';", $test); 
    var_dump($test1); //string 'Test bar and foo or $ble' (length=24) 
2

Bằng cách sửa đổi ljubiccica's answer. Bạn có thể tạo mảng kết hợp với các biến và giá trị và sau đó thay thế chúng:

$array=array(
     'pageTitle'=>$pageTitle, 
     'menuA'=> $menuA, 
     ); 

$addBrackets = function($a) 
{ 
    return '[{'.$a.'}]'; 
}; 
$array1 = array_keys($array); 
$array1 = array_map($addBrackets,$array1); 

$array2 = array_values($array); 

$template = str_replace($array1 , $array2 , $template); 
Các vấn đề liên quan