在 python 中匹配 Javascript 转义表单数据

Matching Javascript escaped form data in python

我正尝试在 python (2.7) 中使用正则表达式进行一些数据验证。例如,从客户端 (javascript) 我收到以下字符串:

name = u'B\xf8tte'

我想使用以下模式(或类似模式)进行匹配,只允许包含拉丁变体的 A-Z 字符:

pattern = '^([A-Za-z\u00C0-\u00D6\u00D8-\u00f6\u00f8-\u00ff\s]*)$'

这在客户端完成匹配时有效(javascript),给定值:

var value = 'Bøtte';

这是因为 javascript 和 python 转义这种字符 (http://www.charbase.com/00f8-unicode-latin-small-letter-o-with-stroke) 的方式不同,特别是“\u00f8”与“\xf8”吗?

是否有一些其他模式适用于 javascript/python?我可能在 encoding/decoding?

中遗漏了什么

MCVE:

请注意,客户端和服务器端的模式相同,匹配客户端,但不匹配服务器端。

值 "Bøtte" 匹配(同样是客户端),而 "Bøtteひ" 不匹配。

客户:

<html class="no-js" lang="no">
 <head>
  <meta charset="utf-8">
  <script type="text/javascript" src="https://code.jquery.com/jquery-3.2.1.min.js"></script>

  <script type="text/javascript">
    $(document).ready(function() {
      $('form').submit(function(e) {
        e.preventDefault();

        var pattern = '^([A-Za-z\-\.\u00C0-\u00D6\u00D8-\u00f6\u00f8-\u00ff\s]*)$';
        var value = $(this).find('input').val();

        if (new RegExp(pattern).exec(value)) {
          $.ajax({
              type: 'POST',
              url: '/',
              data: $(this).serialize(),
              dataType: 'json',
          }).done(function(result) {
            console.log('DONE')
          }).fail(function() {
            console.log('FAIL')
          });
        } else {
          console.log('INVALID FORMAT');
        }
      });
    });
  </script>
 </head>

 <body style="background: #CCC;">
  <form method="post" action="/">
   <input type="text" name="test" value="Bøtte" style="margin: 20px; font-size: 2rem;">
   <input type="submit" name="submit" name="Submit" style="margin: 20px; font-size: 2rem;">
  </form>
 </body>
</html>

服务器: # 导入 重新进口 导入 json 从烧瓶导入烧瓶,请求,render_template,jsonify

# App
app = Flask(__name__)
app.debug = True


# Route: Index
@app.route('/', methods=['GET', 'POST'])
def index():
    if request.method == 'POST':
        data = {}
        # VALIDATE
        for field in request.form.keys():
            value = request.form[field]

            pattern = '^([A-Za-z\-\.\u00C0-\u00D6\u00D8-\u00f6\u00f8-\u00ff\s]*)$'
            match = re.match(pattern, value)

            data[field] = {
                'value': value,
                'match': True if match else False
            }

        print json.dumps(data, indent=4)

        return jsonify({'foo':'bar'})

    else:
        return render_template('index.html')


# Main
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8000)

您可以在 JavaScript (see here) and Python (see here)

中使用 \xYY
^([A-Za-z\xC0-\xD6\xD8-\xf6\xf8-\xff\s]*)$