Regex白名单的url让被阻止的url在消息的同一行通过

fiei3ece  于 2023-03-24  发布在  其他
关注(0)|答案(1)|浏览(129)

所以我有一个正则表达式,它阻止了消息中的URL,但我想把网站的URL列入白名单。
目前,它可以与任何前缀,如HTTP://www.example.com和www.example.com/support/how-do-i-setup-this,但如果我把另一个URL后面,然后它通过过滤器,我不想(只有当我把新的URL在一个新的行,它会被阻止所需)
“go to http://example.com/support/how-do-iwww.badurl.com“这不会阻止我想要发生的badurl
这个字符串也会导致两个都被阻止“www.badurl.comexample.com”,但理想情况下,我想在这里也白名单example.com网址

[-a-zA-Z0-9@:%_\+.~#?&//=]{2,256}\.[a-z]{2,24}\b(\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?(?<!\bexample.com(/.*)?)

当前python函数代码

import re

def link_remover(message):
   #remove any links that aren't in whitelist
   message = re.sub(r"[-a-zA-Z0-9@:%_\+.~#?&//=]{2,256}\.[a-z]{2,24}\b(\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?(?<!\bexample.com)", "[URL Removed]", message)
   return message

所以我只是想知道如何编辑它来修复这两个失败的例子?
我很感激任何回应或为我指出正确的方向:)

cigdeys3

cigdeys31#

最终更新:

添加了一个负的后看边界,开始对白名单项目的每次检查。
示例:(?<=(?<![-a-z\u00a1-\uffff0-9])example\.com)
这个类确保只有一个可选的 Subdomain 可以出现在它之前。
作为正则表达式的唯一可选部分,只允许使用点或正斜杠。
因此,没有字母出血可以与它相邻,例如 wrongexample.com
这是白名单项目可选匹配的示例。
每一个url都是匹配的。白名单检查策略性地放在域名之后
匹配。因此,匹配将包含任何尾随的可选端口或目录。
一个lambda回调就可以检查白名单中是否有匹配的url。
如果是这样的话,就把它们原封不动地写回来。
如果不匹配,则写回 Removed 字符串。

修改逻辑:

更改为仅需要一个捕获组。
group 用作标记。
如果组为 * 无 *,则未找到匹配的白名单项。
在回调中返回 return {Empty} 并覆盖错误的url。
否则,找到白名单项。匹配项将返回不变。

  • return m.group(0)*。

注:
所有url都匹配。单个捕获组。无限数量的白名单项目。
按照下面的模板添加白名单项目。

(?!mailto:)(?:(?:https?|ftp):\/\/)?(?:\S+(?::\S*)?@)?(?:(?:(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,}))((?<=(?<![-a-z\u00a1-\uffff0-9])example\.com)|(?<=(?<![-a-z\u00a1-\uffff0-9])example1\.com)|(?<=(?<![-a-z\u00a1-\uffff0-9])example2\.com))?))|localhost)(?::\d{2,5})?(?:\/[^\s]*)?

https://regex101.com/r/rCBd0P/1

Python代码示例:

import re
 
def ConvertURL_func(input_text):
  #
  def repl(m):
    if m.group(1) == None: return "{Removed}"
    return m.group(0)
  #
  input_text = re.sub(r"(?!mailto:)(?:(?:https?|ftp):\/\/)?(?:\S+(?::\S*)?@)?(?:(?:(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,}))((?<=(?<![-a-z\u00a1-\uffff0-9])example\.com)|(?<=(?<![-a-z\u00a1-\uffff0-9])example1\.com)|(?<=(?<![-a-z\u00a1-\uffff0-9])example2\.com))?))|localhost)(?::\d{2,5})?(?:\/[^\s]*)?",repl,input_text)
  return input_text

# input URL strings example:
input_text = '''
bad.com
www.example.com
example.com
www.badurl.com www.badurlexample2.com
www.badurl.com example1.com
https://www.example2.com
'''

input_text = ConvertURL_func(input_text)
print(input_text)

输出:

>>> print(input_text)

{Removed}
www.example.com
example.com
{Removed} {Removed}
{Removed} example1.com
https://www.example2.com

>>>

正则表达式扩展:

(?! mailto: )
 (?:
    (?: https? | ftp )
    :\/\/
 )?
 (?:
    \S+ 
    (?: : \S* )?
    @
 )?
 (?:
    (?:
       (?:
          [1-9] \d? 
        | 1 \d\d 
        | 2 [01] \d 
        | 22 [0-3] 
       )
       (?:
          \.
          (?: 1? \d{1,2} | 2 [0-4] \d | 25 [0-5] )
       ){2}
       (?:
          \.
          (?:
             [1-9] \d? 
           | 1 \d\d 
           | 2 [0-4] \d 
           | 25 [0-4] 
          )
       )
     | 
       (?:
          (?:
             (?: [a-z\u00a1-\uffff0-9]+ -? )*
             [a-z\u00a1-\uffff0-9]+ 
          )
          (?:
             \.
             (?: [a-z\u00a1-\uffff0-9]+ -? )*
             [a-z\u00a1-\uffff0-9]+ 
          )*
          (?:
             \.
             (?: [a-z\u00a1-\uffff]{2,} )
          )
          (                           # (1 start)
             # Start Whitelist
             
             (?<=
                (?<! [-a-z\u00a1-\uffff0-9] )
                example\.com
             )
           | (?<=
                (?<! [-a-z\u00a1-\uffff0-9] )
                example1\.com
             )
           | (?<=
                (?<! [-a-z\u00a1-\uffff0-9] )
                example2\.com
             )
             
             # Add more whitelist items
          )?                          # (1 end)
       )
    )
  | localhost
 )
 (?: : \d{2,5} )?
 (?: \/ [^\s]* )?

相关问题