在文本中查找主题标签

时间:2019-06-21 06:22:56

标签: php regex hashtag

是的,这里有很多标签正则表达式可用,但是没有一个适合我的需求。实际上,没有人能够解决这个问题。

正则表达式应将以下标签视为有效:

#validhashtag
#valid_hashtag
 #validhashtag_with_space_before_or_after
#valid_hashtag_chars_öÖäÄüÜß

...无效,应该是:

ipsum#notvalid //Not valid: Connected to Word
http://google.com/#results //Not valid: Same as above
#not-valid
#not!valid

允许的字符应为:     a-Z,0-9,öÖäÄüÜß,_

最大长度应为50个字符。

主要问题是主题标签“连接”到另一个文本部分的部分。我不知道如何解决这个问题。

这就是我试图做的

/([\p{Pc}\p{N}\p{L}\p{Mn}]{1,50})/u

那个很好用,但是不考虑“ word#hashtag”-问题。

2 个答案:

答案 0 :(得分:3)

您可以使用以下两个之一:

/(?<!\S)#\w+(?!\S)/u
/(?<!\S)#[\w\p{M}\p{Pc}]+(?!\S)/u

请参见regex demo。如果要限制单词部分的长度,请保留{1,50}量词-/(?<!\S)#\w{1,50}(?!\S)/u

还请注意:即使使用\w修饰符,u也与.NET,Java,Python re正则表达式中被视为“单词”的字符相同。您可能决定包括其他类来填补空白,并使用[\w\p{M}\p{Pc}]+而不是\w,其中\p{M}匹配任何变音符号,\p{Pc}匹配任何连接符标点符号。

详细信息

  • (?<!\S)-空格或字符串开头必须在
  • 之前
  • #-一个#符号
  • \w+-1个以上的字符字符(注意),如果您希望将其长度限制为1到50,则将+替换为{1,50})(此外,请注意,u修饰符使PCRE引擎可以使用\w速记来匹配任何Unicode字母和数字)
  • [\w\p{M}\p{Pc}]-匹配1+个单词字符+所有变音符号(\p{M})和所有连接符标点符号(\p{Pc},在.NET正则表达式中被视为单词)
  • (?!\S)-紧随其后的空格或字符串结尾。

PHP demo

$s = "#validhashtag
#valid_hashtag
 #validhashtag_with_space_before_or_after
#valid_hashtag_chars_öÖäÄüÜß
...and not valid shoulw be:

ipsum#notvalid //Not valid: Connected to Word
http://google.com/#results //Not valid: Same as above
#not-valid
#not!valid";
if (preg_match_all('~(?<!\S)#\w+(?!\S)~u', $s, $matches)) {
   print_r($matches[0]);
}

输出:

Array
(
    [0] => #validhashtag
    [1] => #valid_hashtag
    [2] => #validhashtag_with_space_before_or_after
    [3] => #valid_hashtag_chars_öÖäÄüÜß
)

答案 1 :(得分:3)

我认为您的原始表达非常出色,我们可以使用以下方式对其进行修改:

^\s*#([\p{Pc}\p{N}\p{L}\p{Mn}]{1,50})$

Demo

测试

$re = '/^\s*#([\p{Pc}\p{N}\p{L}\p{Mn}]{1,50})$/um';
$str = '#validhashtag
#valid_hashtag
 #validhashtag_with_space_before_or_after
#valid_hashtag_chars_öÖäÄüÜß

ipsum#notvalid //Not valid: Connected to Word
http://google.com/#results //Not valid: Same as above
#not-valid
#not!valid';

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);

// Print the entire match result
var_dump($matches);

输出

array(4) {
  [0]=>
  array(2) {
    [0]=>
    string(13) "#validhashtag"
    [1]=>
    string(12) "validhashtag"
  }
  [1]=>
  array(2) {
    [0]=>
    string(14) "#valid_hashtag"
    [1]=>
    string(13) "valid_hashtag"
  }
  [2]=>
  array(2) {
    [0]=>
    string(41) " #validhashtag_with_space_before_or_after"
    [1]=>
    string(39) "validhashtag_with_space_before_or_after"
  }
  [3]=>
  array(2) {
    [0]=>
    string(35) "#valid_hashtag_chars_öÖäÄüÜß"
    [1]=>
    string(34) "valid_hashtag_chars_öÖäÄüÜß"
  }
}