php - 我应该使用正则表达式,还是只使用一系列 if 语句?

标签 php javascript regex conditional

我需要根据这些规则验证字符串:

  1. 值不是s
  2. 值的长度至少为 1 个字符
  3. 值仅包含 a-z0-9-_/
  4. 值不以/开头
  5. 值不以/结尾
  6. 值不包含/s/
  7. 值不包含//
  8. 值不以s/开头
  9. 值不以/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/

相关文章:

java - JavaScript eval 函数的强大功能

javascript - 按钮此绑定(bind)指向窗口

regex - Nginx 重写规则以从请求的 url 重定向到特定的 url

java - 拆分 METAR/TAF

php - Htaccess 使用 FastCGI 重写

PHP:对数组进行排序

javascript - 提交表单时将输入文本转换为小写

javascript - 如何将字符串放入文本框中?

html - 我想在 HTML 标记中的正则表达式中添加引号

php - 无法为从数据库回显消息的 <td> 设置最大高度