#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