在 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)
我正尝试在 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)