考虑以下推文:
RT @username This is my tweet
Check this! RT @username This is my tweet
I have PART 2 downloaded
在preg_replace()
调用中,我正在使用正则表达式将RT
(常见的转发语法(替换为{RT}
。它几乎有效,但是,它也与上一条推文中PART
RT
匹配:
-
I have PART 2 downloaded
变得I have PA{RT} 2 downloaded
我希望正则表达式只允许在RT
前面不允许任何内容(字符串开头(或空格(U+0020(。
当前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)
而不是(^|[ ])
将提供更适合你"正确"想法的结果(例如"太棒了,RT 一些推文。尽管如此,请记住,此注释是在被接受后添加的,绝不是此特定问题的答案的一部分 - 它只是为了帮助那些可能遇到类似但不同问题的答案的人。
使用 'b
进行单词边界匹配。 'bRT'b
已编辑:^''s*RT
将匹配任何以 RT 开头的字符串或 RT 等空格
我认为检查 RT 的最佳方法是检查 RT(空格(@username的正则表达式。这意味着你会有类似的东西
#RT's@([a-zA-Z0-9_]+)#
当然,您需要根据用户名中允许的字符更改 [a-zA-Z0-9_]+。考虑到这是一条推文,推特允许字母、数字和下划线,所以这个正则表达式应该可以正常工作。