我需要根据这些规则验证一个字符串:
- 值不是
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');
?>
这是可接受的做法吗?我不太擅长正则表达式,而且我不知道如何为此编写一个——但我不禁觉得这更像是一种破解而不是一种解决方案。
你怎么看?
谢谢。