要删除的字符串的第一个和最后一个字符

时间:2013-08-02 17:20:10

标签: php bioinformatics

我创建了一个名为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

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

任何人都可以解释一下我哪里出错了。

2 个答案:

答案 0 :(得分: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会给出错误,因为类型不同。

即 无论strpos($seq, ">", 0)的结果是什么,你都会得到一个假的,所以其他的将被评估

答案 1 :(得分: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);