2

目的の結果を得るために、いくつかの関数を介して変数を実行しようとしています。

たとえば、テキストをスラッグ化する関数は次のように機能します。

        // replace non letter or digits by -
        $text = preg_replace('~[^\\pL\d]+~u', '-', $text);

        // trim
        $text = trim($text, '-');

        // transliterate
        $text = iconv('utf-8', 'us-ascii//TRANSLIT', $text);

        // lowercase
        $text = strtolower($text);

        // remove unwanted characters
        $text = preg_replace('~[^-\w]+~', '', $text);

ただし、この例にはパターンがあることがわかります。変数は、次の$textような5つの関数呼び出しを介して渡されますpreg_replace(..., $text) -> trim($text, ...) -> iconv(..., $text) -> strtolower($text) -> preg_replace(..., $text)

いくつかの関数を介して変数ふるいを許可するコードを書くことができるより良い方法はありますか?

1つの方法は、上記のコードを次のように記述することです。

$text = preg_replace('~[^-\w]+~', '', strtolower(iconv('utf-8', 'us-ascii//TRANSLIT', trim(preg_replace('~[^\\pL\d]+~u', '-', $text), '-'))));

...しかし、この書き方は冗談であり、嘲笑です。コードの可読性を妨げます。

4

2 に答える 2

3

「関数パイプライン」は固定されているので、これが最良の(そして偶然にも最も単純ではない)方法です。

パイプラインを動的に構築する場合は、次のようにすることができます。

// construct the pipeline
$valuePlaceholder = new stdClass;
$pipeline = array(
    // each stage of the pipeline is described by an array
    // where the first element is a callable and the second an array
    // of arguments to pass to that callable
    array('preg_replace', array('~[^\\pL\d]+~u', '-', $valuePlaceholder)),
    array('trim', array($valuePlaceholder, '-')),
    array('iconv', array('utf-8', 'us-ascii//TRANSLIT', $valuePlaceholder)),
    // etc etc
);

// process it
$value = $text;
foreach ($pipeline as $stage) {
    list($callable, $parameters) = $stage;
    foreach ($parameters as &$parameter) {
        if ($parameter === $valuePlaceholder) {
            $parameter = $value;
        }
    }
    $value = call_user_func_array($callable, $parameters);
}

// final result
echo $value;

実際の動作をご覧ください

于 2013-01-12T14:35:52.943 に答える
0

これを5つすべての組み合わせとして使用します

$text = preg_replace('~[^-\w]+~', '', strtolower(iconv('utf-8', 'us-ascii//TRANSLIT', trim(preg_replace('~[^\\pL\d]+~u', '-', $text), '-'))));

ただし、1行で書くよりも良い習慣であるため、試したとおりに使用してください。

于 2013-01-12T14:29:59.573 に答える