В переменной 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 в настоящее время не работает хорошо, он снимает некоторые пробелы, а также на каждом прогоне, помещая больше фигурных скобок вокруг большинства (но не всех) ключевых слов. Что я делаю не так? Может ли кто-то исправить мое регулярное выражение?
Вы ищете отрицательные утверждения . Они не написаны с использованием синтаксиса ^
как в классах символов, а как (?<!...)
и (?!...)
. В твоем случае:
'|(?<!\{)(\b' . $keyword . '\b)(?!\})|';
$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); }