Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从字符串中筛选出多个字符串_Php_String - Fatal编程技术网

Php 从字符串中筛选出多个字符串

Php 从字符串中筛选出多个字符串,php,string,Php,String,我一直在写一段代码,最后终于明白了它的工作原理,但是我的PHP处理的太多了,我想知道是否有更简单的方法来解决我的问题 我正在使用的数据库中充满了艺术家的曲目,以及表中的示例: 作曲家姓名=[@123:artist\u display\u name1]英尺。 [@58:Artister\u display\u name2] track_title=Le示例([@798:artist_display_name3]混音) 其中,[:是艺术家的id(链接到艺术家个人资料),字符串:]是艺术家的显示名

我一直在写一段代码,最后终于明白了它的工作原理,但是我的PHP处理的太多了,我想知道是否有更简单的方法来解决我的问题

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

  • 作曲家姓名=[@123:artist\u display\u name1]英尺。 [@58:Artister\u display\u name2]
  • track_title=Le示例([@798:artist_display_name3]混音)
其中,[:是艺术家的id(链接到艺术家个人资料),字符串:]是艺术家的显示名称(有时艺术家使用不同的名称,这就是原因)


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

必须使用带有
preg\u match
的正则表达式:

function renderRow($rawRow) {
    return preg_replace("/\[@([0-9]*):([^\]]*)\]/", "$2", $rawRow);
}
另一种方法是一种更直接的方法(O(N)),速度大约是我的快速基准测试的10到20倍:

函数renderRow($rawRow){
$len=strlen($rawRow);
$status=0;
对于($i=0;$i<$len;$i++){
$char=$rawRow[$i];
如果($char=='[')
$status=1;
else if($status==1){
如果($char===':')
$status=2;
继续;
}
如果($status===2&&$char===']'),则为else
$status=0;
其他的
$row.=$char;
}
返回$row;
}

你能在你的表格中添加更多的列来存储
艺术家id
显示姓名吗?
我能,但是涉及到很多其他表格,这基本上让事情变得困难了你能让你的问题更精确一点吗?你在寻找数据库优化技巧吗?解析作曲家姓名和曲目标题的方法?很难知道你在找什么。一个php脚本可以解析字符串中的所有显示名称,所以你想要
[@123:artist\u display\u name1]ft.@58:artist\u display\u name2]
成为
'artist\u display\u name1 ft.artist\u display\u name2'
?哇,谢谢@KeVin,工作得很有魅力,正是我需要的,而且速度更快!顺便说一下,使用了第二个函数!再次感谢!
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;
}