preg_match_all 个特殊条件下的子域
preg_match_all subdomains under special conditions
更新:
我正在使用这个正则表达式:
/[^a-z^-^0-9^@^%^\/^:^\.^-]((?<!w\.)(?!w+\.)([0-9a-z][0-9a-z\-]*\.){2,}[a-z]+)(["|\s|<]|$)/i
当字符串只是域而没有其他内容时,正则表达式有一点问题,在新行中彼此列出
例如:
$string = 'sub84.example4.com
sub-example.example84.net
sub-84example.example-h1.org
www-example4124.domain.com
sub.example-www.com';
应该匹配所有域,但他当前的正则表达式只匹配 sub-example.example84.net
和 www-example4124.domain.com
我还希望添加更多条件:
1) 域名的字母必须小,不能大写(现在的不关心)
例如:Sub.example.Com
不行。
2) 域前无 =SPACE
(SPACE
("
:SPACE
且无 SPACE)
或 SPACE=
")
SPACE:
之后。
EX:
$string = '
text = sub1.example.com text
text ( sub2.example.com text
text sub3.example.com = text
text sub4.example.com ) text
text ("sub5.example.com text
text sub6.example.com") text
text : sub7.example.com text
text sub8.example.com : text
';
None个没问题
3) 排除 .info
.biz
.tv
tlds
谢谢。
这是一个
/[^a-z^-^0-9^@^\/^:^\.^-]((?<!w\.)(?!w+\.)([0-9a-z][0-9a-z\-]*\.)+[a-z]+)(["\s<]|$)/ig
我不太明白这样做的目的或令人难以置信的条件数量,但你可以试试这个(相当长的一个......):
(?<!http://)(?<!https://)(?<!www\.)(?![^\s<>]*[:@/])(?<![(=:] )(?<!\(")(?:(?<=[\s">])|^)(?:[a-z0-9-]+\.){2}(?!info|biz|tv)[a-z]+(?=[\s"<]|$)(?! [=):])(?!"\))
细分:
(?<!http://)(?<!https://)(?<!www\.) # Prevent http:// https:// and www.
(?![^\s<>]*[:@/]) # Prevent : @ /
(?<![(=:] )(?<!\(") # Prevent '( ' '= ' etc
(?:(?<=[\s">])|^) # Ensure there's ' ', '>', '"' or beginning of line
(?:[a-z0-9-]+\.){2}(?!info|biz|tv)[a-z]+ # Main match, alphanumerics and -, 2 parts + tlds (excluding info, biz, tv
(?=[\s"<]|$) # Ensure there's ' ', '<', '"' or end of line
(?! [=):])(?!"\)) # Prevent ' )' ' =' etc
随着正则表达式的发展,向前看和向后看都很昂贵。你可以在没有这个怪物的情况下做到这一点:
(?:^[^0-9a-zA-Z]??|[^=(:][^0-9a-zA-Z\-]|=[^ 0-9a-zA-Z]|\([^ "0-9a-zA-Z]|:[^ 0-9a-zA-Z]|[^0-9a-zA-Z]-)((?:[0-9a-z][0-9a-z\-]*\.){2,}(?:[ac-hj-su-z][a-z]*|b[a-z]?|bi[a-y]|b[a-z]{3,}|i[a-z]{0,2}|inf[a-np-z]|i[a-z]{4,}|t|t[a-uw-z]|t[a-z]{2,}))(?:[^a-zA-Z "]| [^=:)]|"[^)]|[ "]?$)
这将强制每个 1 的小写子域,正确删除您在 2[=100] 中列出的所有前置和 post 条件=],并禁止 .biz、.info 和 .tv 每 3.
但是您需要将它与 m
修饰符一起使用,以便 ^
和 $
可以匹配每行,而不仅仅是输入的开头和结尾。所以你需要做类似的事情:
preg_match_all('/(?:^[^0-9a-zA-Z]??|[^=(:][^0-9a-zA-Z\-]|=[^ 0-9a-zA-Z]|\([^ "0-9a-zA-Z]|:[^ 0-9a-zA-Z]|[^0-9a-zA-Z]-)((?:[0-9a-z][0-9a-z\-]*\.){2,}(?:[ac-hj-su-z][a-z]*|b[a-z]?|bi[a-y]|b[a-z]{3,}|i[a-z]{0,2}|inf[a-np-z]|i[a-z]{4,}|t|t[a-uw-z]|t[a-z]{2,}))(?:[^a-zA-Z "]| [^=:)]|"[^)]|[ "]?$)/m', $string, $foo);
让我快速解释一下正则表达式的各个部分,希望这是有道理的:
第一部分是替代查看子域之前的内容的替代方法,它阻止了您在 2 中列出的先决条件:(?:^[^0-9a-zA-Z]??|[^=(:][^0-9a-zA-Z\-]|=[^ 0-9a-zA-Z]|\([^ "0-9a-zA-Z]|:[^ 0-9a-zA-Z]|[^0-9a-zA-Z]-)
它是一个非捕获组,它将匹配 6 个选项中的 1 个:
- 一行的开头和可能的 1 个非字母数字字符
'='
、'('
或 ':'
以外的字符后跟非字母数字非 '-'
字符
- 一个
'='
后跟一个非 space 和非字母数字字符
- A
'('
后跟 '"'
、space 或字母数字 以外的字符
- 一个
':'
后跟一个非 space 和非字母数字字符
- 一个非字母数字字符后跟一个
'-'
字符
捕获中的第二部分是您的原始子域减去后缀匹配:(?:[0-9a-z][0-9a-z\-]*\.){2,}
第三部分也在捕获中,消除了带有 "biz"
、"info"
或 "tv"
后缀的子域:(?:[ac-hj-su-z][a-z]*|b[a-z]?|bi[a-y]|b[a-z]{3,}|i[a-z]{0,2}|inf[a-np-z]|i[a-z]{4,}|t|t[a-uw-z]|t[a-z]{2,})
它是非- 有 10 个选项的捕获组:
'b'
、'i'
或 't'
以外的字符后跟任意数量的小写字符
- A
'b'
和其他一些小写字符
"bi"
后跟一个非'z'
字符
- 一个
'b'
后跟3个或更多小写字符
- 一个
'i'
后跟不超过 2 个小写字符
"inf"
后跟一个非'o'
字符
- 一个
'i'
后跟4个或更多小写字符
- 一个
't'
个字符
- 一个
't'
后跟一个非'v'
字符
- 一个
't'
后跟2个或更多小写字符
最后一节阻止了您在 2 中列出的 post 条件:(?:[^a-zA-Z "]| [^=:)]|"[^)]|[ "]?$)
它是一个具有 4 个选项的非捕获组:
- 不是 space、
'"'
、小写或大写字符的字符
- A space 后跟
'='
、':'
或 ')'
以外的字符
- 一个
'"'
后跟一个非')'
字符
- 非space非
'"'
后跟行尾
更新:
我正在使用这个正则表达式:
/[^a-z^-^0-9^@^%^\/^:^\.^-]((?<!w\.)(?!w+\.)([0-9a-z][0-9a-z\-]*\.){2,}[a-z]+)(["|\s|<]|$)/i
当字符串只是域而没有其他内容时,正则表达式有一点问题,在新行中彼此列出
例如:
$string = 'sub84.example4.com
sub-example.example84.net
sub-84example.example-h1.org
www-example4124.domain.com
sub.example-www.com';
应该匹配所有域,但他当前的正则表达式只匹配 sub-example.example84.net
和 www-example4124.domain.com
我还希望添加更多条件:
1) 域名的字母必须小,不能大写(现在的不关心)
例如:Sub.example.Com
不行。
2) 域前无 =SPACE
(SPACE
("
:SPACE
且无 SPACE)
或 SPACE=
")
SPACE:
之后。
EX:
$string = '
text = sub1.example.com text
text ( sub2.example.com text
text sub3.example.com = text
text sub4.example.com ) text
text ("sub5.example.com text
text sub6.example.com") text
text : sub7.example.com text
text sub8.example.com : text
';
None个没问题
3) 排除 .info
.biz
.tv
tlds
谢谢。
这是一个
/[^a-z^-^0-9^@^\/^:^\.^-]((?<!w\.)(?!w+\.)([0-9a-z][0-9a-z\-]*\.)+[a-z]+)(["\s<]|$)/ig
我不太明白这样做的目的或令人难以置信的条件数量,但你可以试试这个(相当长的一个......):
(?<!http://)(?<!https://)(?<!www\.)(?![^\s<>]*[:@/])(?<![(=:] )(?<!\(")(?:(?<=[\s">])|^)(?:[a-z0-9-]+\.){2}(?!info|biz|tv)[a-z]+(?=[\s"<]|$)(?! [=):])(?!"\))
细分:
(?<!http://)(?<!https://)(?<!www\.) # Prevent http:// https:// and www.
(?![^\s<>]*[:@/]) # Prevent : @ /
(?<![(=:] )(?<!\(") # Prevent '( ' '= ' etc
(?:(?<=[\s">])|^) # Ensure there's ' ', '>', '"' or beginning of line
(?:[a-z0-9-]+\.){2}(?!info|biz|tv)[a-z]+ # Main match, alphanumerics and -, 2 parts + tlds (excluding info, biz, tv
(?=[\s"<]|$) # Ensure there's ' ', '<', '"' or end of line
(?! [=):])(?!"\)) # Prevent ' )' ' =' etc
随着正则表达式的发展,向前看和向后看都很昂贵。你可以在没有这个怪物的情况下做到这一点:
(?:^[^0-9a-zA-Z]??|[^=(:][^0-9a-zA-Z\-]|=[^ 0-9a-zA-Z]|\([^ "0-9a-zA-Z]|:[^ 0-9a-zA-Z]|[^0-9a-zA-Z]-)((?:[0-9a-z][0-9a-z\-]*\.){2,}(?:[ac-hj-su-z][a-z]*|b[a-z]?|bi[a-y]|b[a-z]{3,}|i[a-z]{0,2}|inf[a-np-z]|i[a-z]{4,}|t|t[a-uw-z]|t[a-z]{2,}))(?:[^a-zA-Z "]| [^=:)]|"[^)]|[ "]?$)
这将强制每个 1 的小写子域,正确删除您在 2[=100] 中列出的所有前置和 post 条件=],并禁止 .biz、.info 和 .tv 每 3.
但是您需要将它与 m
修饰符一起使用,以便 ^
和 $
可以匹配每行,而不仅仅是输入的开头和结尾。所以你需要做类似的事情:
preg_match_all('/(?:^[^0-9a-zA-Z]??|[^=(:][^0-9a-zA-Z\-]|=[^ 0-9a-zA-Z]|\([^ "0-9a-zA-Z]|:[^ 0-9a-zA-Z]|[^0-9a-zA-Z]-)((?:[0-9a-z][0-9a-z\-]*\.){2,}(?:[ac-hj-su-z][a-z]*|b[a-z]?|bi[a-y]|b[a-z]{3,}|i[a-z]{0,2}|inf[a-np-z]|i[a-z]{4,}|t|t[a-uw-z]|t[a-z]{2,}))(?:[^a-zA-Z "]| [^=:)]|"[^)]|[ "]?$)/m', $string, $foo);
让我快速解释一下正则表达式的各个部分,希望这是有道理的:
第一部分是替代查看子域之前的内容的替代方法,它阻止了您在 2 中列出的先决条件:(?:^[^0-9a-zA-Z]??|[^=(:][^0-9a-zA-Z\-]|=[^ 0-9a-zA-Z]|\([^ "0-9a-zA-Z]|:[^ 0-9a-zA-Z]|[^0-9a-zA-Z]-)
它是一个非捕获组,它将匹配 6 个选项中的 1 个:
- 一行的开头和可能的 1 个非字母数字字符
'='
、'('
或':'
以外的字符后跟非字母数字非'-'
字符- 一个
'='
后跟一个非 space 和非字母数字字符 - A
'('
后跟'"'
、space 或字母数字 以外的字符
- 一个
':'
后跟一个非 space 和非字母数字字符 - 一个非字母数字字符后跟一个
'-'
字符
捕获中的第二部分是您的原始子域减去后缀匹配:(?:[0-9a-z][0-9a-z\-]*\.){2,}
第三部分也在捕获中,消除了带有 "biz"
、"info"
或 "tv"
后缀的子域:(?:[ac-hj-su-z][a-z]*|b[a-z]?|bi[a-y]|b[a-z]{3,}|i[a-z]{0,2}|inf[a-np-z]|i[a-z]{4,}|t|t[a-uw-z]|t[a-z]{2,})
它是非- 有 10 个选项的捕获组:
'b'
、'i'
或't'
以外的字符后跟任意数量的小写字符- A
'b'
和其他一些小写字符 "bi"
后跟一个非'z'
字符- 一个
'b'
后跟3个或更多小写字符 - 一个
'i'
后跟不超过 2 个小写字符 "inf"
后跟一个非'o'
字符- 一个
'i'
后跟4个或更多小写字符 - 一个
't'
个字符 - 一个
't'
后跟一个非'v'
字符 - 一个
't'
后跟2个或更多小写字符
最后一节阻止了您在 2 中列出的 post 条件:(?:[^a-zA-Z "]| [^=:)]|"[^)]|[ "]?$)
它是一个具有 4 个选项的非捕获组:
- 不是 space、
'"'
、小写或大写字符的字符 - A space 后跟
'='
、':'
或')'
以外的字符
- 一个
'"'
后跟一个非')'
字符 - 非space非
'"'
后跟行尾