2010-12-23 111 views
-1

我希望用户能够插入的标签,如下列:使用PHP检测标签的最佳方法是什么?

Lorem ipsum dolor sit amet, {module_user_name, 123} consectetur adipiscing elit. 

正如你可以在上面的例子中看到,标签有几个参数。第一个是所需的功能,参数取决于所请求的功能。

所以我会使用正则表达式来检测{和},反馈?然后我会抓住第一个参数并检查它是否存在。

如果确实存在,我会使用一个很好的命名约定来避免使用大量的IF ELSE或切换脚本。像module_user_name会触发moduleUserName()函数或类似的东西,反馈?

**这只是我对如何解决这个问题的想法,我只是想知道如果任何人都可以改善或用速度指出任何问题等等

回答

2

我假设你的意思是某种形式的插件标记。那么{的语法有点太轻了,它可能很容易与常规文本冲突;为什么更换应该谨慎做。这里一个好的技巧是使用preg_replace_callback()像这样:

$html = preg_replace_callback('/\{([\w\s,\d]+)\}/', "tags_", $html); 

function tags_($call) { 

    // split up 
    $func = explode(",", $call[1]); 
    $func = array_map("trim", $func); 

    // test for handler existence 
    if (function_exists($func[0])) { 
     return call_user_func_array(array_shift($func), $func); 
    } 

    return $call[0]; // do not replace 
} 

这里命名用户的功能,如果它存在只会被调用。如果找到类似{wacky text 123}的东西,那么回调会将其返回并因此保持原始$html不变。

+0

首先,我忘了说谢谢你反馈在十二月。我一定非常忙,无法回复。其次,如果我需要像{module_name,123,ABC,1A2B},{module_name,ABC,1}等多个参数,我不太喜欢正则表达式。我需要将正则表达式更改为? – 2011-10-13 06:12:14

+0

这个正则表达式应该已经可以工作了。但是回调包含一个错误,应该说`if(function_exists($ func [0])){`。或者你有另一个错误? – mario 2011-10-13 06:17:45

0

如果它确实存在,我会使用良好的 命名约定来避免必须使用 大量IF ELSE或切换 脚本。像module_user_name 会触发moduleUserName()函数,或 类似的东西,反馈?

这听起来像自动装载机上的变体,其中每个名称映射到一个类/函数。如果你完全控制了命名,那应该不成问题。如果您必须支持现有标签和/或命名约定不一致,则需要使用switch语句或类似命令。

事实上,这与Smarty如何进行函数调用类似。与编写自己的解析器相反,您可以探索那个解析器。它的实现是完善的,可能比你第一次写的更好。

2

我的建议是非常接近到什么马里奥已经给了你,但我想补充:

  • 你应该是一个更详细的使用正则表达式,这样的事情并不像功能忽略(例如{12345})

  • 如果你真的必须有“module_user_name”到“moduleUserName”的翻译,那么你应该设置此作为数组,而不是一个开关:

    $标签=阵列( /* user tag => php function */ 'module_user_name'=>'moduleUserName', 'module_user_id'=>'getUserId', //等 ); 如果(isset($标签[$ FUNC])){ call_user_func($标签[$ FUNC],...) }

避免开关(的原因)是因为它就像一个执行一堆if/elseif语句,它需要更长的时间才能到达底部的情况,而数组有恒定的查找时间(我很确定是这种情况)。

  • 如果你不想保持一个巨型阵列(我不会),然后就决定你将使用为每个用户标签的前缀,这样{module_user_name, 123}转换到PHP USER_TAG_module_user_name(123),只有通话功能从USER_TAG_开始。

  • 不要忘了提供一种方式让用户放在一个{没有它越来越变成别的东西(即使用{{\{

相关问题