正则表达式只匹配前面有空格或没有任何内容的特定字符(行首)

Pr0*_*0no 10 php regex

请考虑以下推文:

RT @username This is my tweet
Check this! RT @username This is my tweet
I have PART 2 downloaded
Run Code Online (Sandbox Code Playgroud)

在一个preg_replace()调用中,我使用正则表达式替换RT(常见的转推语法){RT}.它几乎可以工作,但它也匹配RTPART上一条推文中:

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

我希望正则表达式只允许任何内容(字符串的开头)或前面的空格(U + 0020)RT.

目前的preg_replace()电话:

echo preg_replace("(\RT(?=\s)/", '{RT}', $tweet);
Run Code Online (Sandbox Code Playgroud)

0b1*_*011 9

加入(^|[ ])之前,RT在你的正则表达式匹配字符串的开头空格.在方括号之间添加更多字符以包含它们(例如(^|[ _]),也匹配下划线).

说明

  • ^匹配字符串的开头
  • [ ]比赛空间(U + 0020) (或之间的任何其它字符[])
  • (&)制作
  • |之间(&)装置

所以...

  • (^|[ ])基团其是字符串的开始 空间(U + 0020)

新正则表达式

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

注意: @DVK提到,仅仅匹配字符串的开头和空格(而不是字边界)是不好的做法.由于OP请求特定字符,因此通过字边界进行匹配在技术上不正确.然而,正如@DVK确实提出了一个有效的观点,我想提一下,在很多情况下使用(\b)而不是(^|[ ])更好地提供符合"正确"想法的结果(例如"Awesome,RT Some tweet.").尽管如此,请记住,这个注释是在被接受后添加的,并不是这个特定问题的答案的一部分 - 它仅用于帮助那些可能遇到类似但不同问题的答案的人.

  • 完全正确.虽然在技术上*不是问题的解决方案,但我已经添加了一个关于边界问题的说明并引用了你(并且还提到它是在事后添加的,并且仅为未来用户提供方便,但是*不是*答案的一部分). (2认同)

DVK*_*DVK 5

用于单词边界\b匹配。\bRT\b