考虑以下推文:
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
我希望正则表达式只允许空格(字符串的开头)或RT
前面的空格(U + 0020)。
当前preg_replace()
来电:
echo preg_replace("(\RT(?=\s)/", '{RT}', $tweet);
答案 0 :(得分:9)
在正则表达式(^|[ ])
之前添加RT
以匹配字符串的开头或空格。在方括号中添加更多字符以包含它们(例如(^|[ _])
也匹配下划线。
^
匹配字符串的开头 [ ]
匹配空格(U + 0020) (或[
和]
之间的任何其他字符 (
& )
制作群组 |
&之间(
)
表示或 (^|[ ])
表示组,字符串的开头 或 空格(U + 0020)强> echo preg_replace("/(^|[ ])(\RT(?=\s))/", '$1{RT}', $tweet);
注意: @DVK提到,仅仅匹配字符串的开头和空格(而不是字边界)是不好的做法。由于OP请求特定字符,因此通过字边界进行匹配在技术上不正确。但是,正如@DVK确实提出了一个有效的观点,我想提一下,在许多情况下使用(\b)
代替(^|[ ])
会提供更符合您“正确”理念的结果(例如“真棒” ,RT一些推文。“)。尽管如此,请记住,这个注释是在被接受后添加的,并不是这个特定问题的答案的一部分 - 它仅用于帮助那些可能遇到类似但不同问题的答案的人。
答案 1 :(得分:1)
使用\b
进行word boundary匹配。 \bRT\b
答案 2 :(得分:1)
编辑: ^ \ S * RT
将匹配以RT开头的任何字符串或RT
之类的空格答案 3 :(得分:0)
我认为检查RT的最佳方法是检查RT(空格)@username的正则表达式。这意味着你会有像
这样的东西#RT\s@([a-zA-Z0-9_]+)#
当然,您需要根据用户名中允许的字符更改[a-zA-Z0-9 _] +。考虑到它是推文,Twitter允许字母,数字和下划线,所以这个正则表达式应该工作正常。