2012-03-28 230 views
0

我试图挑选出某个字符串后的单词/短语(用hashtags包裹)。例如:我怎样才能挑出一个字符串后的单词?

这是一个示例段落,我试图获取散列标签中的艺术家名字后面的单词/短语,例如@ calvinharris #feel so close#。现在

,我已经能够成功地使用从抢串所有@words:

preg_match_all('[email protected](.+)(?:\s|$)!U', $string, $matches) 

但是,有没有办法,我可以很容易地抓住主题标签包围的短语(如果他们有)在@名后?

回答

2

试试下面的正则表达式:

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

如果你想删除空格

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

如果你想大量削减

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

而且你不知道有hashtag(或称它为wathever)

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

为什么使用锚? '@'不在字符串的开头。 – erm410 2012-03-28 20:34:26

+0

在他的案例中'@calvinharris#感觉如此接近#''@'在开头 – grifos 2012-03-28 20:35:13

+0

这不匹配字符串中没有散列。 – 2012-03-28 20:38:38

1

这应该可以做到。

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

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

1

记得让你的字符集越具体越好:

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

[^\s]+将匹配到第一个空白区域[^#]+将匹配最近的哈希标记。

1

这似乎达到目的(无/ /定界符附带):

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

“1或多个非空白,随后用1或多个空格,随后通过#括一些字符”

注意使用非贪婪算子(?)作为散列内部的文本。

编辑

preg_match_all后,$匹配[1]将对应于艺术家的名字,$匹配[2]在哈希标签文本

+0

这只会匹配iff字符串包含#。在问题中它们是可选的。 – 2012-03-28 20:46:17

1

您可以轻松地通过使用组和的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 

这个想法是使用分组(括号内的东西)并得到这个组。

相关问题