我创建了一个名为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
当仅给出原始序列时,将删除第一个和最后一个字母。
任何人都可以解释一下我哪里出错了。
答案 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);