2012-05-04 8 views
1

私は理解できないコードに問題があります。 誰でもお手伝いできますか?長さ/文字列の変更を変えてワードラップする方法は?

$query="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"; 
$seq=chunk_split($query,50,"<br />"); 
$truecol = "<span style=\"color: hsl(0,100%,25%);\">"; 
function colorSequence ($seq,$position,$truecol,$TFBSlength){ 
    $nucleotides = str_split($seq); 
    foreach ($nucleotides as $index => $nucl){ 
     if ($index == $position){ 
      echo $truecol; 
     } 
     if ($index == $position + $TFBSlength){ 
      echo "</span>"; 
     } 

     echo $nucl; 
    } 
    echo "\n"; 
} 
colorSequence($seq,49,$truecol,1); 
?> 

これは私のコードです。 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA(red)A(/red) AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBCCCCCC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC

、それは私がしかし、機能colorSequence($seq,49,$truecol,1); を実行したときに、私はcolorSequence($seq,49,$truecol,3);を実行する場合、私はこの取得を行います:基本的に私はこのようにして出力コードをワン AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA< span="">r />AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBCCCCCC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC<>(手紙49からのすべての文字も私カントー、赤を49文字から51文字までの3文字だけが赤であることが必要です)。

誰でもこの問題を解決できますか?

+0

ここで何をしようとしていますか?このスクリプトは何ですか? –

+0

私は特定のフォーマットでシーケンスを表示し、この前に定義される外部結果に従ってシーケンスの特定の部分を着色しようとしています。 – user1338194

答えて

2
$query="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"; 
$seq=chunk_split($query,50,''); 
$truecol = "<span style=\"color: hsl(0,100%,25%);\">"; 
function colorSequence ($seq,$position,$truecol,$TFBSlength){ 
    $nucleotides = str_split($seq); 
    foreach ($nucleotides as $index => $nucl){ 
     if ($index == $position){ 
      echo $truecol; 
     } 
     if ($index == $position + $TFBSlength){ 
      echo "</span>"; 
     } 
     if(($index%50)==0){ 
      echo '<br>'; 
     } 

     echo $nucl; 
    } 
    echo "\n"; 
} 
colorSequence($seq,49,$truecol,1); 
echo '<hr>'; 
colorSequence($seq,49,$truecol,3) 
+0

この呼び出しは役に立たず、何もしません: 'chunk_split($ query、50、 '');'なぜあなたはそれを残したのだろうか。 – hakre

1

関数によって追加されたスパンタグは、chunk_splitで作成されたHTMLを分割します。

2

あなたprint_r($nucleotides)場合は、DNSの文字列$queryあなたを変更すると、あなたは...

Array 
(
    ...... 
    [49] => A 
    [50] => < 
    [51] => b 
    [52] => r 
    [53] => 
    ...... 
) 

はそうあなたが次のHTMLを破壊<br /><span>を挿入すること

+0

ありがとう、私はほとんどの人にとって明白だと確信しています。私は長いPHPを学んでいない。 \ – user1338194

+0

@ user1338194:この回答が**あなたの問題を解決しなかった場合は、それを受け入れないでください。それは役に立つかもしれません(そして、それは2票を得た理由です)。しかし、それがあなたの問題を解決しなければ、それは受け入れられてはなりません。 –

+0

@ user1338194:真実は言った、それをすぐに受け入れないでください。私はあなたが[昨日の他の関連する質問](http:// stackoverflow。com/q/10428048/367456)。 – hakre

0

が表示されますヌクレオチドの位置と一般的なストリングオフセットとの間で異なる必要がある。

最初はどちらも同じですが、文字列に追加するほど多くの違いがあります。あなたは、HTMLタグの世話をし、(タグの前後の空白を囲む含む)、それらをカウントされませんので、それ自身のオブジェクトに文字列をカプセル化した場合

、物事は簡単に再びなる:

$query = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"; 

// wrap line: 11 lines à 50 nucleotids 
$seq = chunk_split($query, 50, "<br />\n"); 

// get help from sequence object 
$sequence = new AmendSequence($seq); 

// some HTML comments for demonstration purposes 
$sequence->insertAt(0, "<!-- first line -->\n"); 
$sequence->insertAt(50, "<!-- second line -->\n", TRUE); # TRUE: Place after <br /> 
$sequence->insertAt(75, "<!-- inside second line -->"); 
$sequence->insertAt(550, "<!-- at end -->", TRUE); # TRUE: Place after <br /> 

// colorize 
$color = '<span style="color: hsl(0,100%,25%);">'; 
$sequence->insertAt(49, $color); 
$sequence->insertAt(50, '</span>'); 

printf("Sequence with %d nucleotids:\n", count($sequence)); # count gives length w/o amends 
echo $sequence, "\n"; # that prints your sequence with all amends 

どの次の出力を作成します。

Sequence with 550 nucleotids: 
<!-- first line --> 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA<span style="color: hsl(0,100%,25%);">A</span><br /> 
<!-- second line --> 
AAAAAAAAAAAAAAAAAAAAAAAAA<!-- inside second line -->AAAAAAAAAAAAAAAAAAAAAAAAA<br /> 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA<br /> 
AAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB<br /> 
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB<br /> 
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB<br /> 
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBCCCCCC<br /> 
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC<br /> 
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC<br /> 
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC<br /> 
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC<br /> 
<!-- at end --> 

ので、ここで実際の魔法がnucledotideのオフセット位置を受け入れ、それのためのオフセットの文字列を計算insertAt方法です。それはすべて、初めにはあまりにも多すぎるかもしれないが、DNAとHTMLを含む文字列をDNSのセグメンテーションに分割し、実際の文字列オフセットを得ることです。完全なソースコード:

<?php 
/** 
* @link http://stackoverflow.com/questions/10446162/how-to-wordwrap-with-different-length-string-modification 
*/ 

/** 
* Treat text with "tags" as text without tags when insertAt() is called. 
*/ 
class AmendSequence implements IteratorAggregate, Countable 
{ 
    /** 
    * regex pattern for a tag 
    */ 
    const TAG = '\s*<[^>]*>\s*'; 

    /** 
    * @var string 
    */ 
    private $query; 

    /** 
    * @param string $query 
    */ 
    public function __construct($query = '') 
    { 
     $this->setQuery($query); 
    } 

    /** 
    * @param int $offset 
    * @param string $string 
    * @param bool $after (optional) prefer after next tag instead before 
    */ 
    public function insertAt($offset, $string, $after = FALSE) 
    { 
     $offset = $this->translate($offset, $after); 
     $this->query = substr_replace($this->query, $string, $offset, 0); 
    } 

    /** 
    * Translate virtual offset to string offset 
    * @param int $virtualOffset 
    * @return int 
    * @throws InvalidArgumentException 
    */ 
    public function translate($virtualOffset, $after) 
    { 
     if ($virtualOffset < 0) throw new InvalidArgumentException(sprintf('Offset can not be lower than 0, is %d.', $virtualOffset)); 
     $virtualCurrent = 0; 
     foreach ($this as $segment) { 
      list(, $current, $length) = $segment; 
      $delta = ($virtualOffset - $virtualCurrent) - $length; 
      if ($delta < 0 || ($delta === 0 && !$after)) { 
       return $current + $length + $delta; 
      } 
      $virtualCurrent += $length; 
     } 
     if ($virtualCurrent === $virtualOffset && $after) { 
      return strlen($this->query); 
     } 
     throw new InvalidArgumentException(sprintf('Offset can not be larger than %d, is %d.', $virtualCurrent, $virtualOffset)); 
    } 

    /** 
    * @return array 
    */ 
    public function getSegments() 
    { 
     $segments = preg_split('/' . self::TAG . '/', $this->query, 0, PREG_SPLIT_OFFSET_CAPTURE | PREG_SPLIT_NO_EMPTY); 
     foreach ($segments as &$segment) { 
      $segment[2] = strlen($segment[0]); 
     } 
     return $segments; 
    } 

    public function getSequence() 
    { 
     $buffer = ''; 
     foreach ($this as $segment) { 
      $buffer .= $segment[0]; 
     } 
     return $buffer; 
    } 

    /** 
    * @return string 
    */ 
    public function getQuery() 
    { 
     return $this->query; 
    } 

    /** 
    * @param string $query 
    */ 
    public function setQuery($query) 
    { 
     $this->query = (string)$query; 
    } 

    /** 
    * Retrieve an external iterator 
    * @link http://php.net/manual/en/iteratoraggregate.getiterator.php 
    * @return Traversable An instance of an object implementing <b>Iterator</b> or <b>Traversable</b> 
    */ 
    public function getIterator() 
    { 
     return new ArrayIterator($this->getSegments()); 
    } 


    /** 
    * @link http://php.net/manual/en/countable.count.php 
    * @return int The custom count as an integer. 
    */ 
    public function count() 
    { 
     $length = 0; 
     foreach ($this as $segment) { 
      $length += $segment[2]; 
     } 
     return $length; 
    } 

    /** 
    * @return string 
    */ 
    public function __toString() 
    { 
     return $this->query; 
    } 
} 

$query = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"; 

// wrap line: 11 lines à 50 nucleotids 
$seq = chunk_split($query, 50, "<br />\n"); 

// get help from sequence object 
$sequence = new AmendSequence($seq); 

// some HTML comments for demonstration purposes 
$sequence->insertAt(0, "<!-- first line -->\n"); 
$sequence->insertAt(50, "<!-- second line -->\n", TRUE); # TRUE: Place after <br /> 
$sequence->insertAt(75, "<!-- inside second line -->"); 
$sequence->insertAt(550, "<!-- at end -->", TRUE); # TRUE: Place after <br /> 

// colorize 
$color = '<span style="color: hsl(0,100%,25%);">'; 
$sequence->insertAt(49, $color); 
$sequence->insertAt(50, '</span>'); 

printf("Sequence with %d nucleotids:\n", count($sequence)); # count gives length w/o amends 
echo $sequence, "\n"; # that prints your sequence with all amends 

echo $sequence->getSequence(); # without the amends 

は今、お気軽にお好きなように多くの部分を色付けする - と、または既にシーケンス内の他のHTMLなし。

関連する問題