从字符串中过滤掉多个字符串

时间:2014-09-09 20:56:41

标签: php string

我一直在研究一个代码,最后得到了它可行的品脱,但我的PHP处理得非常多,以至于我想知道是否有更简单的方法来解决我的问题

我正在使用的数据库中充满了来自艺术家的曲目,以及表中的示例:

  • composer_name = [@ 123:artist_display_name1] ft。 [@ 58:artist_display_name2]
  • track_title = Le Example([@ 798:artist_display_name3] Remix)

[:是artist_id(链接到艺术家资料)和之间的字符串之间的数字是:]是艺术家的显示名称(有时艺术家使用不同的名称,这就是原因)

现在的问题是如何在没有括号的情况下尽可能快地获取显示名称,但是使用artist_id执行另一个操作(例如从中创建链接并将artist_id放入数据库或其他内容)

1 个答案:

答案 0 :(得分:1)

强制性的方法是使用带preg_match的正则表达式:

function renderRow($rawRow) {
    return preg_replace("/\[@([0-9]*):([^\]]*)\]/", "$2", $rawRow);
}

另一种方式,大约快10倍到20倍(根据我的快速基准测试)是一种更直接的方法(O(N)):

function renderRow($rawRow) {
    $len = strlen($rawRow);
    $status = 0;
    for ($i = 0; $i < $len; $i++) {
        $char = $rawRow[$i];
        if ($char === '[')
            $status = 1;
        else if ($status === 1) {
            if ($char === ':')
                $status = 2;
            continue;
        }
        else if ($status === 2 && $char === ']')
            $status = 0;
        else 
            $row .= $char;
    }
    return $row;
}