是的,这里有很多标签正则表达式,但没有一个能满足我的需求。实际上,没有人能够解决这个问题。
Regex应将以下哈希标记视为有效:
#validhashtag
#valid_hashtag
#validhashtag_with_space_before_or_after
#valid_hashtag_chars_öÖäÄüÜß无效的...and应为:
ipsum#notvalid //Not valid: Connected to Word
http://google.com/#results //Not valid: Same as above
#not-valid
#not!valid允许的字符数应为: a-Z,0-9,öÖäüuu§,_
最大长度应为50个字符。
主要的问题是hashtag被“连接”到另一个文本部分。我不知道如何解决这个问题。
这就是我想要做的
/([\p{Pc}\p{N}\p{L}\p{Mn}]{1,50})/u这个方法运行得很好,但没有考虑到"word#hashtag“问题。
发布于 2019-06-21 14:26:38
我认为你的原始表达式非常棒,我们只需要修改一下:
^\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_öÖäÄüÜß"
}
}发布于 2019-06-21 14:26:27
您可以使用以下两种方法之一:
/(?<!\S)#\w+(?!\S)/u
/(?<!\S)#[\w\p{M}\p{Pc}]+(?!\S)/u请参阅regex demo。如果您想限制单词部分长度,请保留您的{1,50}量词- /(?<!\S)#\w{1,50}(?!\S)/u。
还要注意:即使带有u修饰符的\w也不匹配在.NET、Java、Python re正则表达式中被认为是“单词”的相同字符。您可以决定包含其他类来填补空白,并使用[\w\p{M}\p{Pc}]+而不只是\w,其中\p{M}匹配任何变音符号,\p{Pc}匹配任何连接器标点符号。
详细信息
(?<!\S) -需要空格或字符串开头的正确before# -a Unicode sign\w+ - 1+单词字符(请注意,如果您想将其长度限制在1到50之间,请将替换为+ )(同时,请注意,u修饰符允许\w引擎使用Unicode匹配任何Unicode字母和数字-匹配1+单词字符+所有变音符号(\p{M})和所有连接符标点(\p{Pc},在.NET regex)(?!\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_öÖäÄüÜß
)https://stackoverflow.com/questions/56697913
复制相似问题