是的,这里有很多标签正则表达式可用,但是没有一个适合我的需求。实际上,没有人能够解决这个问题。
正则表达式应将以下标签视为有效:
#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”-问题。
答案 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)
-紧随其后的空格或字符串结尾。$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})$
$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_öÖäÄüÜß"
}
}