2

我试图通过几个函数运行一个变量以获得期望的结果。

例如,对文本进行 slugify 的函数是这样工作的:

        // 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)

有没有更好的方法可以编写代码以允许变量筛选多个函数?

一种方法是像这样编写上面的代码:

$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

将其用作所有五个的组合

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

但是请按照您的尝试使用。因为这是一种很好的做法,而不是写在一行中。

于 2013-01-12T14:29:59.573 回答