Регулярное выражение для соответствия ключевому слову, если оно не заключено в фигурные скобки

В переменной PHP у меня есть текст, содержащий несколько ключевых слов. Эти ключевые слова в настоящее время капитализируются. Я бы хотел, чтобы они оставались заглавными и обернуты фигурными скобками, но только один раз. Я пытаюсь написать код обновления, но каждый раз, когда он запускается, он обматывает ключевые слова в другом наборе фигурных скобок.

Какой REGEX мне нужно использовать для соответствия ключевому слову самостоятельно, не сравнивая его, если это {KEYWORD}.

Например, текстовая переменная:

$string = "BLOGNAME has posted COUNT new item(s), TABLE POSTTIME AUTHORNAME You received this e-mail because you asked to be notified when new updates are posted. Best regards, MYNAME EMAIL"; 

И мой код обновления:

 $keywords = array('BLOGNAME', 'BLOGLINK', 'TITLE', 'POST', 'POSTTIME', 'TABLE', 'TABLELINKS', 'PERMALINK', 'TINYLINK', 'DATE', 'TIME', 'MYNAME', 'EMAIL', 'AUTHORNAME', 'LINK', 'CATS', 'TAGS', 'COUNT', 'ACTION'); foreach ($keywords as $keyword) { $regex = '|(^\{){0,1}(\b' . $keyword . '\b)(^\}){0,1}|'; $replace = '{' . $keyword . '}'; $string = preg_replace($regex, $replace, $string); } 

Мой REGEX в настоящее время не работает хорошо, он снимает некоторые пробелы, а также на каждом прогоне, помещая больше фигурных скобок вокруг большинства (но не всех) ключевых слов. Что я делаю не так? Может ли кто-то исправить мое регулярное выражение?

Related of "Регулярное выражение для соответствия ключевому слову, если оно не заключено в фигурные скобки"

Вы ищете отрицательные утверждения . Они не написаны с использованием синтаксиса ^ как в классах символов, а как (?<!...) и (?!...) . В твоем случае:

 '|(?<!\{)(\b' . $keyword . '\b)(?!\})|'; 
  • Он будет работать, если ключевое слово не содержит специальный символ.
  • (A1) строки могут быть удалены из регулярного выражения, если исходный текст не может содержать {ключевое слово} или необходимо оставить символы «{}» вокруг ключевых слов в тексте результата (было {keyword} требуется {{keyword}} для форматирования в качестве примера)

 $text = <<<EOF BLOGNAME has posted COUNT new item(s), TABLE POSTTIME AUTHORNAME You received this e-mail because you asked to be notified when new updates are posted. Best regards, MYNAME EMAIL EOF; $aKeywords = array('BLOGNAME', 'BLOGLINK', 'TITLE', 'POST', 'POSTTIME', 'TABLE', 'TABLELINKS', 'PERMALINK', 'TINYLINK', 'DATE', 'TIME', 'MYNAME', 'EMAIL', 'AUTHORNAME', 'LINK', 'CATS', 'TAGS', 'COUNT', 'ACTION'); $keywords = implode('|', $aKeywords); $reSrch = '/ (?<!\{) # (A1) prev symbol is not { \b # begin of word ('.$keywords.') # list of keywords \b # end of word (?!\{) # (A1) next symbol is not { /xm'; // m - multiline search & x - ignore spaces in regex $reRepl = '{\1}'; $result = preg_replace($reSrch, $reRepl, $text); echo '<pre>'; // echo '$reSrch:'.$reSrch.'<hr>'; echo $result.'<br>'; 

Почему регулярное выражение? Просто используйте str_replace :

 foreach ($keywords as $k) { $string = str_replace($k, '{'.$k.'}', $string); }