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

时间:2012-02-15 16:31:51

标签: php regex

考虑以下推文:

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);

4 个答案:

答案 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允许字母,数字和下划线,所以这个正则表达式应该工作正常。