我试图通过几个函数运行变量来获得所需的结果。
例如,function to slugify a text的工作方式如下:
// 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), '-'))));
......但这种写作方式是一个笑话和嘲弄。它阻碍了代码的可读性。
答案 0 :(得分: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;
<强> See it in action 强>
答案 1 :(得分:0)
将其用作所有五种
的组合$text = preg_replace('~[^-\w]+~', '', strtolower(iconv('utf-8', 'us-ascii//TRANSLIT', trim(preg_replace('~[^\\pL\d]+~u', '-', $text), '-'))));
但是在你尝试的时候使用。因为这是一种很好的做法,而不是写在一行。