2009-07-29 120 views
4

有没有更好的方法来做这个简单的任务如下?像数组或甚至另一种方法?这个PHP代码可以改进吗?

<?PHP 
// current way 
if ($city != NULL) { 
    $city = FilterALLHTML($city); 
} 
if ($state != NULL) { 
    $state = FilterALLHTML($state); 
} 
if ($title != NULL) { 
    $title = FilterALLHTML($title); 
} 
if ($division != NULL) { 
    $division = FilterALLHTML($division); 
} 
?> 

这里是我当前的功能

function FilterALLHTML($document) { 
    //old array line //"'<[\/\!]*?[^<>]*//?//>'si",// strip html 
    $text = strip_tags($document); 
    $search = array ("/f.?u.?c.?k/i", 
       "/(s|$).?h.?i.?t/i", 
       '/(potspace|mycrib|palbolt)/i'); 
    $text = preg_replace ($search, '', $text); 
    return $text; 
} 

更新 - 好我的新功能后,从这个职位的建议,谢谢你们

function FilterALLHTML($var) { 
    //old array line //"'<[\/\!]*?[^<>]*//?//>'si",// strip html 
    if ($var != null){ 
     $text = strip_tags($var); 
     $search = array ("/f.?u.?c.?k/i", 
        "/(s|$).?h.?i.?t/i", 
        '/(potspace|mycrib|palbolt|pot space)/i'); 
     $text = preg_replace ($search, '', $text); 
     return $text; 
    } 
    return null; 
} 
+3

为什么要阻止用户说“frutcake”或“as heist”? – eyelidlessness 2009-07-29 08:39:42

回答

15

更改FilterALLHTML功能做null检查并返回null? 然后你可以扔掉所有的if s。

例子:

function FilterALLHTML($input) 
{ 
    if ($input === null) 
     return null; 

    // Original code, I'll just use strip_tags() for a functional example 
    return strip_tags($input); 
} 

编辑:

我觉得像共享一个替代变量的变量,因为我真的不喜欢使用字符串常量,而不是变量名的想法。参考一路:)

function FilterALLHTML(&$text) 
{ 
    if ($text !== null) 
    { 
     // Omitted regex bit for simplicity 
     $text = strip_tags($text); 
    } 
} 

$city = "<b>New York</b>"; 
$state = null; 
$title = "<i>Mr.</i>"; 

$fields = array(&$city, &$state, &$title); 
foreach ($fields as &$var) 
    FilterALLHTML($var); 

注:FilterALLHTML实现从第一个例子不同)

+0

+1我喜欢你的回答,也许你可能会在你的回复中稍微冗长一些,以免得到它:) – Makach 2009-07-29 07:34:49

+0

我喜欢它,我甚至都没有想到,谢谢 – JasonDavis 2009-07-29 07:37:15

+1

请评论downvote ?我不介意,但我想要一些建设性的批评。不要因为它不是你的回答而下降,因为它不是:) – Thorarin 2009-07-29 07:46:37

0

我不认为你可以提高性能,但可以缩短语法,但它会最终被同样的解释

<?PHP 
    $city = ($city == NULL) ? "default value" : FilterALLHTML($city); 
    $state = ($state == NULL) ? "default value" : FilterALLHTML($state); 
    $title = ($title == NULL) ? "default value" : FilterALLHTML($title); 
    $division = ($division == NULL) ? "default value" : FilterALLHTML($division); 
?> 

“默认值”应与你想什么值更换了,如果变量为空

3

那么,你可能已经考虑编写一个函数,因为你做了四次完全相同的事情。

假设FilterALLHTML不是自定义函数。

function Filter($var) 
{ 
    if ($var != null) 
    { 
     return FilterALLHTML($var); 
    } 
    return null; 
} 

或者只是在FilterALLHTML函数中包含null检查,并且如果需要的话从那里返回null。

所以,如果你可以改变FilterALLHTML,那么你会做这样的:

function FilterALLHTML($var) 
{ 
    if ($var == null) 
    { 
     return null; 
    } 
    else 
    { 
     //do your filtering 
     return $filteredVar; 
    } 
} 
9

是,使用PHP的variable variables

$vars = array('city','state','title','division'); 
foreach($vars as $v) { 
    if ($$v != null) $$v = FilterAllHTML($$v); 
} 

如果您知道所有变量先前已定义的事实,那么您不需要空检查。否则,空检查将防止触发E_NOTICE错误。

1

添加到Thorarin的答案,你可以改变你的filterall函数,以接受一个数组作为输入,并通过引用传递它将修改数组的内容。

$tofilter = array($city,$state,$division,$title); 


filterall($tofilter); 
5
foreach (array('city', 'state', 'title', 'division') as $var) { 
    if ($$var != null) { 
     $$var = FilterALLHTML($$var); 
    } 
} 

Thorarin我建议具有空的FilterALLHTML功能检查,而不是虽然。

3

zombat的答案是最好的,但我想补充一点,你不应该真的在检查null。如果由于某种原因,FilterAllHTMLnull值有问题,但不应该将null的检查置于FilterAllHTML函数定义中。

$vars = array('city', 'state', 'title', 'division'); 
foreach($vars as $var) { 
    $$var = FilterAllHTML($$var); 
} 
1

我没有看到它提到,你总是可以通过引用传递的参数跳过重复分配:

function FilterALLHTML(&$var) 
{ 
    if ($var == null) 
    { 
     $var = null; 
    } 
    else 
    { 
     $var = strip_tags($var); 
    } 
} 

我相信你也可以存储在阵列中的引用,但我的天堂” t试过了。

foreach (array(&$city, &$state, &$title, &$division) as $var) 
{ 
    FilterALLHTML($var); 
}