PHP - 正则表达式需要帮助

时间:2010-08-25 17:36:56

标签: php regex preg-match

我收到了一份联系表格,我需要过滤一些单词。

我这样做:

$array = array('lorem', 'ipsum', 'ip.sum');
for($i = 0; $i < count($array); $i++)
        {
            if( preg_match("/".$array[$i]."/", (string) $field) )
            {
                return false;
            }
        }

我不是正则表达式大师,但它应该用于像lorem或ipsum这样的词。但事实并非如此。

顺便说一句。任何建议如何捕捉拼写错误的话,例如。 i.psum,l.o.rem?

更新
当然,我没有空图案,我只是忘了粘贴它。

更新2
我决定采用 Daniel Vandersluis 建议的方式。 Abnyway,我无法让它发挥作用。

$field = "ipsum lorem"; // This value comes from textarea
$array = array('ipsum', 'lorem', 'ip.sum');
foreach($array as $term):
    if(preg_match('/'.preg_quote($term).'/', $field)) {
        return false;
    }
endforeach;

有什么想法吗?

5 个答案:

答案 0 :(得分:3)

如果我理解正确,并且您想查看数组中的任何字词是否在您的字段中,您可以执行以下操作:

function check_for_disallowed_words($text, $words)
{
  // $text is the text being checked, $words is an array of disallowed words
  foreach($words as $word)
  {
    if (preg_match('/' . preg_quote($word) . '/', $text))
    {
      return false;
    }
  }

  return true;
}

$array = array('lorem', 'ipsum', 'ip.sum');
$valid = check_for_disallowed_words($field, $array);

在您的示例中,您没有定义要使用的任何模式。 preg_quote将使用一个字符串并准备好在正则表达式中使用(因为,例如,ip.sum中的点实际上在正则表达式中有special meaning,因此需要对其进行转义如果你想搜索文字点。)

顺便说一句,如果您想了解有关正则表达式的更多信息,请查看regular-expressions.info上的tutorial,这是非常深入的。

答案 1 :(得分:2)

您不需要正则表达式来进行简单的单词过滤。

function is_offensive($to_be_checked){
   $offensive = array('lorem', 'ipsum', 'ip.sum');
   foreach($offensive as $word){
      if(stristr($to_be_checked, $word) !== FALSE){
          return FALSE;
      }
   }
}

用法:

$field = $_POST['field'];
if(is_offensive($field)){
   echo 'Do not curse on me! I did not crash your computer!';
}
else{
    //make the visitor happy
}

答案 2 :(得分:1)

我这样翻译了你的问题:如何通过正则表达式替换变量中的单词。

你可以试试这个:

 $array = array('lorem', 'ipsum', 'ip.sum', '');

 $field = preg_replace("/(" . implode(")|(", $array) . ")/i", "--FILTERED-OUT--", (string) $field));

它从$array的元素构造最终正则表达式。这样你就可以指定一个单词作为正则表达式(ip.sum~ip [无论字符]总和)。 标记i用于不区分大小写的搜索。

答案 3 :(得分:0)

更改

if( preg_match("//", (string) $field) )

if( preg_match("/$array[$i]/", (string) $field) )

答案 4 :(得分:0)

另一种变体,可能是某种用途(你没有非常彻底地指明问题):

根据用户的评论

编辑

 // comparison function
 function check_field_in($field, $phrases)
{
 foreach($phrases as $phrase) {
    $match_text = quotemeta($phrase);            // if this works, 
    if( preg_match("/^$match_text$/", $field) )  // this part can be optimized
       return false;                             
 }
 return true;
}

// main program goes here
 $textarea = 'lorem ipsum  i.psum l.o.rem';

 foreach(preg_split('/\s+/', $textarea) as $field) {
    if( check_field_in( $field, array('lorem','ipsum') ) == true )
       echo "$field OK\n";
    else
       echo "$field NOT OK\n";
 }

这将打印:

lorem NOT OK
ipsum NOT OK
i.psum OK
l.o.rem OK

此致

RBO