Regex соответствует только определенным символам, которым предшествует пробел или ничего (начало строки)

Рассмотрим следующие твиты:

RT @username This is my tweet Check this! RT @username This is my tweet I have PART 2 downloaded 

В preg_replace() я использую регулярное выражение, чтобы заменить RT (общий синтаксис ретветов ) на {RT} . Он почти работает, однако он также соответствует RT в PART в последнем твитте:

  • I have PART 2 downloaded I have PA{RT} 2 downloaded

Я хочу, чтобы регулярное выражение не допускало ничего (начало строки) или пробела (U + 0020) перед RT .

Текущий preg_replace() :

 echo preg_replace("(\RT(?=\s)/", '{RT}', $tweet); 

Добавьте (^|[ ]) до RT в вашем регулярном выражении, чтобы соответствовать началу строки или пробелу. Добавьте еще символы между квадратными скобками, чтобы включить их (например, (^|[ _]) чтобы также соответствовать символам подчеркивания.

объяснение

  • ^ соответствует началу строки
  • [ ] соответствует пробелу (U + 0020) (или любому другому символу между [ и ] )
  • ( & ) создать группу
  • | между ( & ) средствами или

Так…

  • (^|[ ]) означает группу, которая является либо началом строки, либо пространством (U + 0020)

Новое регулярное выражение

 echo preg_replace("/(^|[ ])(\RT(?=\s))/", '$1{RT}', $tweet); 

Примечание: @DVK было упомянуто, что плохая практика соответствует только началу строки и пробелу (а не границам слов). Поскольку конкретные символы запрашивались OP, сопоставление по границам слов не является технически корректным. Однако, поскольку @DVK действительно допустил ошибку, я хотел бы упомянуть, что использование (\b) вместо (^|[ ]) во многих случаях даст результаты, которые лучше подходят для вашей идеи «правильно» (например, «Awesome , RT Some tweet. "). Тем не менее, имейте в виду, что эта заметка была добавлена ​​после принятия и никоим образом не является частью ответа на этот конкретный вопрос – она ​​предоставляется только тем, кто может столкнуться с этим ответом для подобной, но другой проблемы.

Используйте \b для соответствия границе слова . \bRT\b

Отредактировано: ^ \ s * RT

будет соответствовать любой строке, начинающейся с RT или пространства, такого как RT

Я думаю, что лучший способ проверить RT – это регулярное выражение для проверки RT (пробела) @username. Это означает, что у вас есть что-то вроде

 #RT\s@([a-zA-Z0-9_]+)# 

Конечно, вам нужно будет изменить [a-zA-Z0-9 _] + в зависимости от того, какие символы разрешены в имени пользователя. Учитывая, что это твит, twitter позволяет писать буквы, цифры и подчеркивания, чтобы это регулярное выражение работало нормально.