2013-04-24 132 views
0

我正面臨從html代碼調用PHP函數並填充函數參數的問題。 之後,HTML代碼與返回的函數值一起輸出。從HTML字符串調用php函數

中的示例:

某處在PHP文件中定義的函數

function html_field($type,$name,$value){ 
//some code here 
return $out; 
} 
// or other example function 
function boldme($text){ 
return "<b>$text</b>"; 
} 

之後產生HTML輸出在字符串內的PHP函數(如標籤)

HTML字符串:

$html = "<h1><label for="foo">{call~html_field("text","name","value")} </label><input type="text" name="foo" id="foo" /> </h1>"

點OR

$html = "<h1><label for="foo">{call~boldme("text")} </label><input type="text" name="foo" id="foo" /> </h1>"

解決方案應結束,如:

$html = "<h1><label for="foo"><input type="text" name="name" ...> </label><input type="text" name="foo" id="foo" /> </h1>"

OR

$html = "<h1><label for="foo"><b>text</b> </label><input type="text" name="foo" id="foo" /> </h1>"

,要求過濾此字符串...

注意: 包含從模板和主題收集的html數據的字符串, 它們是純HTML,它們是中的不可知文件。

我使用preg_replace_callback來創建所需的功能,但現在都走了,謝謝我的老闆....!@#!

+0

這是不安全的,但你正在尋找[eval()函數(http://nl3.php.net/manual/en/function.eval .php) – 2013-04-24 11:28:31

+4

我實際上更喜歡'preg_replace_callback()'在'eval()'上的任何一天。 – 2013-04-24 11:29:39

+0

我試圖跳過eval()... – fire1 2013-04-24 11:29:50

回答

1

如果你需要分析一個字符串,並調用一些樂趣根據它,您可以使用preg_replace_callback功能。

像這樣的東西應該做的伎倆:

$html = "<p>{functionName('value1', 'value2')}</p>"; 

function contentParser($matches) 
{ 
    $function = $matches[1]; 
    $parameters = array_slice($matches, 2); 

    return call_user_func_array($function, $parameters); 
} 

function functionName($valueA, $valueB) 
{ 
    return "You called functionName with values " . $valueA . " and " . $valueB; 
} 

echo preg_replace_callback(
    "/\{(\w+)\([\"']([^\"']+)[\"'](?:, ?[\"']([^\"']+)[\"'])?\)\}/", 
    "contentParser", 
    $html); 

這將打印以下內容:

You called functionName with values value1 and value2 

注意,我正則表達式有一個很大的問題。
您可以用單引號或雙引號(「或」)括住這些值(在您的html中),並且可以將它們混合在一起... 這導致第二個問題,你不能在你的值中使用(我不檢查轉義序列)。

僅使用一個字符作爲值包裝(你可以改變這種性格,當然)一個簡單圖案如下:

"/\{(\w+)\(#([^#]+)#(?:, ?#([^#]+)#)?\)\}/" 

這裏我使用的是鋒利的(#)的值分隔符,那麼,你的HTML應該是這樣的:

<p>{functionName(#value1#, #value2#)}</p> 
+0

謝謝!就是這個! – fire1 2013-04-24 12:51:02

1

$html字符串從哪裏來?如果是靜態代碼,使用標準的PHP:

$html = '<h1><label for="foo">' . html_field("text","name","value") . '</label><input type="text" name="foo" id="foo" /> </h1>'; 

如果他們是從數據庫或文件或任何加載,你必須選擇:

  • 使自己的模板引擎,大量的工作,一些bug,浪費時間
  • 使用一個輕量級的模板引擎就像twig,並定義功能filters