我试图在某个字符串后面挑出单词/短语(用hashtags包装)。例如:
这是一个示例段落,我试图在哈希标签中的艺术家名称之后得到单词/短语,例如@calvinharris #feel so close#。
现在,我已经能够使用以下方法成功获取字符串中的所有@words:
preg_match_all('!@(.+)(?:\s|$)!U', $string, $matches)
但有没有办法可以在@name之后轻松抓取标签旁边的短语(如果它们在那里)?
答案 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
这个想法是使用分组(括号之间的东西)并获得这个组。