判断字符串是否为驼峰命名法

Jam*_*mes 5 php validation camelcasing string-formatting phpcodesniffer

我试图让 PHP_CodeSniffer 检查类名中的驼峰命名法,但在我看来,驼峰命名法检查是不可能的(没有字典,包括技术单词)。

我已经在互联网上搜索过,但到目前为止,我看到的唯一选择是字符串是否有一些通用的分隔符来爆炸 - 即下划线、单词之间的空格等。

即使这也没有什么用处,因为只有当名称准确/始终在每个单词之间包含分隔符时,检查才能准确。
“检查”的目的是确定名称的格式是否不正确,这可能包括不正确的定界。

此外,PHP_CodeSniffer 上的资源要么很少见,要么非常基础和技术性,只有作者/开发人员才能理解。

当前标准嗅探检查

我在一些当前的 Sniffs(即 Squiz 和 PEAR 标准)中找到了这段代码:

if (PHP_CodeSniffer::isCamelCaps($functionName, false, true, false) === false) 
Run Code Online (Sandbox Code Playgroud)

但是,我查看了 PHP_CodeSniffer 核心代码,该函数仅执行以下操作:

// Check the first character first.
// Check that the name only contains legal characters.
// Check that there are not two capital letters next to each other.
// The character is a number, so it cant be a capital.
Run Code Online (Sandbox Code Playgroud)

这些基本检查总比没有好,尽管可以说对于其预期目的来说毫无用处,因为它们根本不检查驼峰命名法。

问题

Sniff(或 PHP 脚本)如何知道在给定字符串中检查哪些“单词”以识别该字符串是否为 100% 驼峰命名法?


编辑

例子

正确的驼峰式大小写:class calculateAdminLoginCount

// Not camelCase
class calculateadminlogincount

// Partially camelCase
class calculateadminLogincount
Run Code Online (Sandbox Code Playgroud)

该函数(或任何与此相关的 PHP 脚本)如何isCamelCaps()捕获上述两个示例?

当函数或 PHP 脚本没有“单词”的概念而不向其提供该信息(即来自字典)时,它如何识别字符串中的“单独单词”?

即使一个脚本在哪里爆炸,它会根据什么爆炸?

任何class calculateadminLogincount
PHP 脚本如何识别calculate admin Login count该字符串中的不同单词,然后能够检查:第一个字母第一个单词是小写,然后所有后续单词第一个字母都是大写?

isCamelCaps()功能

public static function isCamelCaps(
    $string,
    $classFormat=false,
    $public=true,
    $strict=true
) {

        // Check the first character first.
        if ($classFormat === false) {
            $legalFirstChar = '';
            if ($public === false) {
                $legalFirstChar = '[_]';
            }

            if ($strict === false) {
                // Can either start with a lowercase letter, 
                // or multiple uppercase
                // in a row, representing an acronym.
                $legalFirstChar .= '([A-Z]{2,}|[a-z])';
            } else {
                $legalFirstChar .= '[a-z]';
            }
        } else {
            $legalFirstChar = '[A-Z]';
        }

        if (preg_match("/^$legalFirstChar/", $string) === 0) {
            return false;
        }

        // Check that the name only contains legal characters.
        $legalChars = 'a-zA-Z0-9';
        if (preg_match("|[^$legalChars]|", substr($string, 1)) > 0) {
            return false;
        }

        if ($strict === true) {
            // Check that there are not two capital letters 
            // next to each other.
            $length          = strlen($string);
            $lastCharWasCaps = $classFormat;

            for ($i = 1; $i < $length; $i++) {
                $ascii = ord($string{$i});
                if ($ascii >= 48 && $ascii <= 57) {
                    // The character is a number, so it cant be a capital.
                    $isCaps = false;
                } else {
                    if (strtoupper($string{$i}) === $string{$i}) {
                        $isCaps = true;
                    } else {
                        $isCaps = false;
                    }
                }

                if ($isCaps === true && $lastCharWasCaps === true) {
                    return false;
                }

                $lastCharWasCaps = $isCaps;
            }
        }//end if

        return true;

    }//end isCamelCaps()
Run Code Online (Sandbox Code Playgroud)

编辑2

对于那些想知道这是否值得,或者我是否只是“闲逛”和“玩得开心”的人来说,有一些信息:

类名必须始终正确命名,因为文件/文件夹结构以及名称和类名必须匹配才能使自动加载器正常工作。

虽然我检查了核心代码本身,以检查和处理此类问题(如果无法加载脚本、类等)(当然),但是使用额外的脚本(PHP_CodeSniffer)来运行所有文件并告诉我潜在的问题在哪里并没有什么问题。问题可能是谎言。
即使只是进行第二次检查,尤其是它还确保代码库整洁、结构正确并且始终具有连续性。

chu*_*die 0

您可以通过分解大小写转换的单词来分析函数名称的大小写是否正确。对于原始函数名称的每个部分,在字典或字典+术语文件中查找该子词(“calc”、“url”、“admin”等(也许首先检查术语))。如果任何子词失败,则说明正确的大写字母不正确。

您可以使用 Solr 或 ElasticSearch 通过 Lucene 中的 WordDelimiterFilter 将单词分开。当大小写改变时,这将创建子词:

"PowerShot" -> "Power" "Shot" "LoginURL" => "Login" "URL"

您可以将单词直接插入这些 NoSQL 数据库并稍后进行分析,或者您可以(至少在 ES 中)简单地使用单词分隔符标记过滤器来分解您的查询,而不实际保存结果。

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/analysis-word-delimiter-tokenfilter.html

https://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.WordDelimiterFilterFactory

例子:

calcAdminLogin => calc 管理员登录

钙管理登录 => 钙管理登录

如果您有一本补充字典,其中包含“calc”和“admin”等单词,那么第一个函数名称将分解为出现在字典中的 3 个单词,因此驼峰式大小写是正确的。

在第二个示例中,在字典中找不到“calcadminlogin”,因此驼峰式大小写不正确。