改进PHP功能

时间:2016-09-14 12:27:12

标签: php function switch-statement

我正在使用异常字符串的switch-function,应该更改正确的h1-titles等等。

我的目标是减少function ausnahme的例外情况。

function ausnahme($value) {
    global $value; // now the function ausnahme may change the variable
    switch ($value) {
        case "kern teilchenphysik": $value = "Kern-/Teilchenphysik";
            break;
        case "tipps tricks": $value = "Tipps & Tricks";
            break;
        case "erich honecker": $value = "Erich Honecker";   
            break;
        case "ökogeographische regeln": $value = "Ökogeographische Regeln";
        break;              
    }
    return $value;
}

此开关现在有3000行,我希望在此功能开关之前有规则。

示例:要删除所有带有2个单词或更好的x-words的开关项,这些单词都应以大写字母开头,我希望我的函数是bigwords:

示例:双字 - >两个单词,三个单词表达 - >三字表达

不应该允许某些词语像'und','das';'der','die'等一样大写。

function bigwords($value) {
    global $value;
    $value = "X" . $value;
// Hilfsvariable,da & sonst auf Position 0 steht,
// was gleichbedeutend mit FALSE/NULL angesehen wird
    if (strpos($value, "&a") == "1") {
        $value = substr($value, 2);
        $value = "&" . ucfirst($value);
    } elseif (strpos($value, "&o") == "1") {
        $value = substr($value, 2);
        $value = "&" . ucfirst($value);
    } elseif (strpos($value, "&u") == "1") {
        $value = substr($value, 2);
        $value = "&" . ucfirst($value);
    } else {
        // X wieder entfernen
        $value = substr($value, 1);
        $value = ucfirst($value);
    }
} 

我可以在切换之前用这个部分删除许多切换线,因为对于其他一些情况不同或我会称之为异常的例外;-)。 另一个问题是德语变音符号:

示例:'oeffnung-boerse-oekologie'现在是:'Öffnungbörseökologie' 我想用function bigwordsfunction umlaute来实现:'ÖffnungBörseÖkologie'。

function umlaute($value) {
    global $value;      // 12.07.14 str_replace changed from eregi_replace/ 22.07.14 mehrere str_replace mit arrays geändert
    $from = ['-', 'ae', 'oe', 'ue', 'Ae', 'Oe', 'Ue'];
    $to = [' ', 'ä', 'ö', 'ü', 'Ä', 'Ö', '&Uuml'];
    $value = mb_strtolower(str_replace($from, $to, $value), 'utf-8');
// ACHTUNG! Dadurch greift die "erster Buchstabe Groß"-Regel nicht mehr, da erster
// "Buchstabe" nun das Kaufmanns-Und ist! -> wird in bigwords ersetzt
}

//最后2条评论可能已经过时,因为我认为bigwords-rule适用于此功能。我以前的程序员写脚本的东西,第一个字母是'&'这个功能之后不再是一封信了。

随时提供现有function bigwordsfunction umlaute的提示 谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

如果我理解你,这应该可以解决问题:

<?php 

$noUpper = [];
foreach (
    ['und','das','der','die']
    as $k
) $noUpper[$k] = true;
function prettify($inStr){
    global $noUpper;
    $out = [];
    foreach (
        explode(" ", $inStr)
        as $chunk
    ) array_push($out, @ $noUpper[$chunk] ? $chunk : ucfirst($chunk));
    return htmlentities(implode(" ", $out));
};

echo prettify("hello und me no das & der die"); // Sorry: I don't understand German ;-)

// Output: "Hello und Me No das &amp; der die"

对于html实体翻译,我使用了现有的htmlentities()php函数。

修改

新版本,注释中提到了修改:

<?php 

function prettify($inStr){

    static $noUpper;
    if (is_null($noUpper)) { // Messy static trick
        $noUpper = [];
        foreach (
            ['und','das','der','die']
            as $k
        ) $noUpper[$k] = true;
    };

    $out = [];
    foreach (
        explode("-", $inStr)
        as $chunk
    ) array_push($out, @ $noUpper[$chunk] ? $chunk : ucfirst($chunk));
    return htmlentities(implode(" ", $out));
};

echo prettify("hello-und-me-no-das-&-der-die"); // Sorry: I don't understand German ;-)

// Output: "Hello und Me No das &amp; der die"

...而且,作为(好的)基于闭包的实现的一个例子,这将是javascript中的相同实现:

"use strict";
var prettify = (function(){
    // Notice, this is only internally visible scope.
    var noUpper = {};
    for (
        let k of ['und','das','der','die']
    ) noUpper[k] = true;
    function htmlentities(str){
        // There is no native php htmlentities() equivalent in javascript.
        // So should implement it or rely on existing implementations in external
        // modules such underscore.
        // I left it empty because it is only for explanatory purposes.
        return str.replace("&", "&amp;"); // (Just to match PHP example...)
    };

    // ...and below function would be the only thing visible (exposed) outside.
    return function prettify_implementation(inStr){
        return htmlentities(inStr
            .split("-")
            .map(function(chunk){
                chunk = chunk.toLowerCase();
                return noUpper[chunk]
                    ? chunk
                    : chunk.substring(0, 1).toUpperCase()
                        +chunk.substring(1)
                ;       
            })  
            .join(" ")
        );  

    };
})();

console.log(prettify("hello-und-me-no-das-&-der-die")); // Sorry: I don't understand German ;-)

// Output: "Hello und Me No das &amp; der die"