Как сделать preg_match, чтобы находить целое слово, но не отдельные дефисные слова?

#php #regex #preg-match #text-parsing #hyphen

#php #регулярное выражение #preg-match #синтаксический анализ текста

Вопрос:

 if (preg_match('#b'.$rawword.'b#i',$body)) {   
  

Этот код находит целые слова, но если они являются дефисным словом, таким как «РАБОТОСПОСОБНЫЙ», он найдет «РАБОТОСПОСОБНЫЙ» и «BODIED» отдельно. Как можно изменить выражение, чтобы приспособить его к тире?

Ответ №1:

Вы можете использовать операторы lookbehind и lookahead. Эти операторы просматривают behind и after, но не сопоставляют их.

например, используйте b(?<!-)xyz(?!-)b для поиска целых слов, xyz которые не имеют - before или after.

Комментарии:

1. просто ради всех, что делает (?<!) (?!*) означает точно — или что делают эти символы?

2. @user723220 Это утверждения lookbehind и lookahead, соответственно, в совокупности известные как утверждения lookaround . Они определяют, существует ли шаблон до или после строки, фактически не сопоставляя ничего. (Они «нулевой ширины», отсюда и термин «утверждение».)

3. хм, похоже, это убило мой preg_match

4. if (preg_match(‘#b(?<!-)$rawword(?!-)b #i’,$body)) {

5. @user723220 В '#b(?<!-)$rawword(?!-)b#i' , сейчас вы пытаетесь использовать замену переменной в строке, заключенной в одинарные кавычки, что не сработает. Добавляйте, как вы делали раньше, или используйте двойные кавычки. PHP string ref