请考虑以下推文:
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}
.它几乎可以工作,但它也匹配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);
Run Code Online (Sandbox Code Playgroud)
加入(^|[ ])
之前,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.").尽管如此,请记住,这个注释是在被接受后添加的,并不是这个特定问题的答案的一部分 - 它仅用于帮助那些可能遇到类似但不同问题的答案的人.