我需要根据这些规则验证字符串:
- 值不是
s
- 值的长度至少为 1 个字符
- 值仅包含
a-z0-9-_/
- 值不以
/
开头 - 值不以
/
结尾 - 值不包含
/s/
- 值不包含
//
- 值不以
s/
开头 - 值不以
/s
结尾
(更简单地说,我正在寻找类似于 UNIX 风格的路径,带有斜杠分隔符,其中文件/文件夹名称只允许 a-z0-9-_
,没有文件/文件夹名为 s
,它没有开头或结尾的斜杠。)
我需要在客户端通过 JavaScript 执行此操作,在服务器端使用 PHP 执行此操作。
我知道最优雅 的解决方案是通过复杂的正则表达式。但是尝试写一个值得挑战吗?还是我应该只使用条件?
现在,我的解决方案是:http://jsfiddle.net/cKfnW/
JavaScript:
(function ($) {
var test = function (val) {
return
val != 's' &&
/^[a-z0-9-_\/]+$/.test(val) &&
val.substr(0, 1) != '/' &&
val.substr(val.length-1) != '/' &&
val.search('/s/') == -1 &&
val.search('//') == -1 &&
val.substr(0, 2) != 's/' &&
val.substr(val.length-2) != '/s';
};
$('#test')
.keyup(function () {
if (test($(this).val())) {
$(this).removeClass('fail').addClass('pass');
}
else {
$(this).removeClass('pass').addClass('fail');
}
)
.keyup();
})(jQuery);
PHP:
<?php
function test ($val) {
return
$val != 's' &&
preg_match('/^[a-z0-9-_\/]+$/', $val) &&
substr($val, 0, 1) != '/' &&
substr($val, -1) != '/' &&
strpos($val, '/s/') === false &&
strpos($val, '//') === false &&
substr($val, 0, 2) != 's/' &&
substr($val, -2) != '/s';
}
die (test($_GET['test']) ? 'pass' : 'fail');
?>
这是可以接受的做法吗?我不太擅长正则表达式,而且我不知道如何为此编写正则表达式——但我不禁觉得这更像是一种 hack,而不是一种解决方案。
你怎么看?
谢谢。
最佳答案
即使有了检查,您肯定也应该通过将它们全部合并为一个 if 来摆脱嵌套 IF。 这是带有 2 个正则表达式的更简单的变体(首先限制您的边缘情况,其次检查允许的字符):
if (
$val != 's'
&& !preg_match('!(^/|/s|s/|//|/$)!', $val)
&& preg_match('!^[a-z0-9-_/]+$!', $val)
) {
// ...
}
更新: 哦,当我输入答案时你已经删除了嵌套的 IFs :) 好,好!
关于php - 我应该使用正则表达式,还是只使用一系列 if 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18322244/