Еще один хитрый preg_match - PullRequest
       13

Еще один хитрый preg_match

2 голосов
/ 07 декабря 2009

Просто нужно посмотреть, содержит ли абзац "стоп-слово", стоп-слова в массиве ниже.

У меня была формула:

$pattern_array = array("preheat", "minutes", "stir", "heat", "put", "beat", "bowl", "pan");

    foreach ($pattern_array as $pattern) {
      if (preg_match('/'.$pattern.')/i', $paragraph)) {
        $stopwords = 1;
      }
    }

Это работает достаточно хорошо, но для коротких слов, таких как «пан», слово, подобное «панко», идентифицируется как стоп-слово.

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

Также, как я могу сказать php выйти из цикла, как только будет идентифицировано стоп-слово?

Спасибо, ребята, замедляя изучение регулярных выражений, пока я иду!

Ответы [ 4 ]

4 голосов
/ 07 декабря 2009

Используйте \b(preheat|minutes|stir|heat|put|bowl|pan)\b в качестве регулярного выражения. Таким образом, вам потребуется только одно регулярное выражение (без необходимости циклического выполнения), и, используя \b утверждения границы слова, вы убедитесь, что совпадают только целые слова.

2 голосов
/ 07 декабря 2009

1. Вы можете использовать «\ b» для проверки границ слов. Граница слова определяется как граница между символом слова и несловесным символом. слова-символы - это буквы, цифры и подчеркивание.

2. Вы можете сделать все это сразу, используя "|":

$stopwords = preg_match('/\\b(preheat|minutes|stir|heat|..other words..|pan)\\b/i', $paragraph)
2 голосов
/ 07 декабря 2009

вам нужно добавить \b (что означает границу слова) к вашему регулярному выражению следующим образом:

'/\b'.$pattern.'\b/i'

Кажется, в вашем коде есть опечатка, потому что либо у вас есть буквальная закрывающая скобка (и не совпадают части текста), либо у вас есть открытая закрывающая скобка.

2 голосов
/ 07 декабря 2009

Не пробовал, но \b должна быть группа персонажей, которую вы ищете. Из руководства PHP :

 \b   word boundary

Ваш код будет выглядеть примерно так:

$pattern_array = array("preheat", "minutes", "stir", "heat", "put", "beat", "bowl", "pan");

foreach ($pattern_array as $pattern) {
  if (preg_match('/\b'.$pattern.'\b/i', $paragraph)) { // also removed the ')'
    $stopwords = 1;
    break; // to exit the loop
  }
}

Редактировать: кажется, что людям лучше использовать \ b, поэтому изменили это соответственно

...