考虑以下推文:
RT @username This is my tweet
Check this! RT @username This is my tweet
I have PART 2 downloaded
In a preg_replace()
调用,我正在使用正则表达式来替换RT
(常见的retweet语法)与{RT}
。它几乎可以工作,但是,它也匹配RT
in PART
在最后一条推文中:
-
I have PART 2 downloaded
变成I have PA{RT} 2 downloaded
我希望正则表达式只允许nothing(字符串的开头)或空间 (U+0020)在...前面RT
.
目前的preg_replace()
call:
echo preg_replace("(\RT(?=\s)/", '{RT}', $tweet);
Add (^|[ ])
before RT
在你的正则表达式中匹配字符串的开头or空间。在方括号之间添加更多字符以将它们也包括在内(例如(^|[ _])
也匹配下划线。
解释
-
^
火柴字符串的开头
-
[ ]
火柴空间 (U+0020) (或之间的任何其他字符[
and ]
)
-
(
& )
make a group
-
|
之间(
& )
means or
So...
-
(^|[ ])
意味着一个group这是字符串的开头 or 空间 (U+0020)
新正则表达式
echo preg_replace("/(^|[ ])(\RT(?=\s))/", '$1{RT}', $tweet);
Note:@DVK 提到,仅匹配字符串开头和空格(而不是单词边界)是很糟糕的做法。由于 OP 要求使用特定字符,因此按单词边界进行匹配在技术上并不正确。然而,正如 @DVK 确实提出了一个有效的观点,我想提一下,使用(\b)
代替(^|[ ])
在许多情况下,会提供更符合您“正确”想法的结果(例如“太棒了,转发一些推文。”)。不过,请记住,此注释是在被接受后添加的,绝不是此特定问题的答案的一部分 - 它只是为了帮助那些可能遇到类似但不同问题的答案的人。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)