-1

我创建了一个名为 checkfasta 的函数,其代码如下

function checkfasta($seq)
    {
    if(strpos($seq, ">", 0) === "FALSE")
        {
        $dna = preg_replace("/[^ATCG]/", "", strtoupper($seq));
        return $dna;
        }
    else
        {
        $descst = strpos($seq, ">", 0);
        $seqst = strpos($seq, "\n", $descst);
        if(substr_count($seq, ">") == 1)
            {
            $seqen = strlen($seq);
            }
        else
            {
            $seqen = strpos($seq, ">", $seqst)-1;
            }
        $exseq = substr($seq, $seqst+1, ($seqen-$seqst));
        $dna = preg_replace("/[^ATCG]/", "", strtoupper($exseq));
        return $dna;
        }
    }

我正在尝试从用户输入中提取序列。如果用户给出这样的原始序列:

ATGCTAGCTATTAGCTAGCTAGCTACGATCCAC

程序应将整个字符串作为变量。如果用户给出这样的序列:

>序列

ATGCTAGCTATTAGCTAGCTAGCTACGATCCAC

该程序应从第二行开始执行整个序列。

上面的函数是为此而创建的,但是当我以这种方式使用该函数时:

<?php
include "functions.php";
$seq1 = "GCTAGCTAGCTACGTACGACTGCTAGTAC";
$seq2 = ">Sequence
GCTAGCTAGCTACGTACGACTGCTAGTAC";
echo checkfasta($seq1)."<br>";
echo checkfasta($seq2)."<br>";
?>

这是我得到的输出:

CTAGCTAGCTACGTACGACTGCTAGTA

GCTAGCTAGCTACGTACGACTGCTAGTAC

当仅给出原始序列时,将删除第一个和最后一个字母。

谁能解释我哪里出错了。

4

2 回答 2

2

您应该将 strops() 的结果与布尔 FALSE 进行比较,而不是与值为“FALSE”的字符串进行比较

if(strpos($seq, ">", 0) === FALSE)

不是

if(strpos($seq, ">", 0) === "FALSE")

解释

如果strpos($seq, ">", 0)返回布尔值 FALSE,然后将其与字符串“FALSE”进行比较(特定于类型),因此 PHP 会给出错误,因为类型不同。

如果strpos($seq, ">", 0)返回布尔值 TRUE,然后将其与字符串“FALSE”进行比较(类型特定),那么 PHP 会给出错误,因为类型不同。

ie 无论 的结果如何strpos($seq, ">", 0),你总是会得到一个假的,所以 else 将被评估

于 2013-08-02T17:27:18.300 回答
0

编辑:我已经重新编写了函数,它仍然更简单,它会检查你在评论中提到的内容:

function evenFasterCheck($seq) {
    $smash = explode("\n",$seq);
    if(is_array($smash) && count($smash)>0) {
        //it's seq2 format
        if(strpos(trim($smash[0]), ">") === 0) {
            return preg_replace("/[^ATCG]/", "", strtoupper($smash[1]));
        }
    }else {
        //it's seq1 format
        return preg_replace("/[^ATCG]/", "", strtoupper($seq)); 
    }
}

echo evenFasterCheck($seq2);
于 2013-08-02T17:34:40.197 回答