我如何在字符串后面挑出单词?

时间:2012-03-28 20:28:20

标签: php regex

我试图在某个字符串后面挑出单词/短语(用hashtags包装)。例如:

  

这是一个示例段落,我试图在哈希标签中的艺术家名称之后得到单词/短语,例如@calvinharris #feel so close#。

现在,我已经能够使用以下方法成功获取字符串中的所有@words:

preg_match_all('!@(.+)(?:\s|$)!U', $string, $matches)

但有没有办法可以在@name之后轻松抓取标签旁边的短语(如果它们在那里)?

5 个答案:

答案 0 :(得分:2)

尝试以下正则表达式:

^@(.+)#(.+)#$

如果你想删除空格

^@(.+)\S*#(.+)\S*#$

如果你想修剪很多

^@\S*(.+)\S*#\S*(.+)\S*#$

你不确定是否有标签(或称之为监视器)

^@\S*(.+)\S*(#\S*(.+)\S*#)?$

答案 1 :(得分:1)

这应该可以解决问题。

preg_match_all('/@(\w+)\s?(?:#([^#]+)#)?/', $string, $matches);

$matches[1]将包含“艺术家姓名” $matches[2]将包含可选短语

答案 2 :(得分:1)

请记住尽可能使字符集具体化:

preg_match_all('!@([^\s]+) #([^#]+)#!U', $string, $matches)

[^\s]+将匹配第一个空格,[^#]+将匹配关闭的哈希标记。

答案 3 :(得分:1)

这似乎可以解决问题(不包括/ /分隔符):

@(\S+)\s+#(.+?)#

“一个或多个非空格,后跟一个或多个空格,后跟一些由#”包围的字符

请注意使用非贪婪的运算符(?)作为哈希内的文本。

编辑:

preg_match_all之后,$ match [1]将对应于艺术家名称,$ match [2]对应于哈希标记中的文本

答案 4 :(得分:1)

您可以使用groups和preg_match轻松完成此操作。

$name = "calvinharris";
preg_match('/@'.$name.' #([\w\s]+)#/', "This is an example paragraph and I am trying to get the word/phrase after the artist name which is in hash tags, such as @calvinharris #feel so close#. ", $match);
echo '$match = ' . $match[1]; //feel so close

这个想法是使用分组(括号之间的东西)并获得这个组。