PHP - нужна помощь по регулярным выражениям - PullRequest
2 голосов
/ 25 августа 2010

У меня есть контактная форма, мне нужно отфильтровать несколько слов.

Я делаю это следующим образом:

$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
Я решил найти способ, предложенный Даниэлем Вандерслойсом . 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 ]

3 голосов
/ 25 августа 2010

Если я правильно понимаю, и вы хотите увидеть, есть ли в вашем поле какие-либо слова из вашего массива, вы можете сделать что-то вроде этого:

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 на самом деле имеет специальное значение в регулярном выражении, так что его нужно экранировать, если вы хотите найти буквальную точку).

Кроме того, если вы хотите больше узнать о регулярных выражениях, взгляните на учебник на сайте регулярных выражений, он очень углубленный.

2 голосов
/ 25 августа 2010

Вам не нужны регулярные выражения для простой фильтрации слов.

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
}
1 голос
/ 25 августа 2010

Я перевел ваш вопрос для меня так: как заменить слова из переменной с помощью набора регулярных выражений.

Вы можете попробовать это:

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

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

Создает окончательное регулярное выражение из элементов $array.Так что вы можете указать слово как регулярное выражение (сумма ip.sum ~ ip [любой символ]).Флаг i используется для поиска без учета регистра.

0 голосов
/ 25 августа 2010

Другой вариант, может быть, он вам пригодится (вы не очень подробно указали проблему):

Отредактировано в соответствии с комментариями пользователя:

 // 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

0 голосов
/ 25 августа 2010

Изменить

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

на

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