【问题标题】:How to wordwrap with different length / string modification?如何用不同的长度/字符串修改换行?
【发布时间】:2012-05-04 09:25:27
【问题描述】:

我的代码有一个我不理解的问题。 有人可以帮忙吗?

$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 个字母是红色的)。

谁能解决这个问题?

【问题讨论】:

  • 你想在这里做什么?这个脚本是干什么用的?
  • 我正在尝试以某种格式显示序列,并根据在此之前定义的外部结果为序列的特定部分着色。

标签: php css word-wrap


【解决方案1】:
$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)

【讨论】:

  • 这个调用太没用了,它什么也没做:chunk_split($query,50,'');。我想知道你为什么把它留在里面。
【解决方案2】:

如果你print_r($nucleotides),你会看到

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

所以您将 &lt;span&gt; 插入到 &lt;br /&gt; 中,这会破坏以下 html...

【讨论】:

  • 谢谢,我相信这对大多数人来说是显而易见的。我学php的时间不长。你能建议一个快速的方法来获得同样的效果吗?\
  • @user1338194:如果此答案没有解决您的问题,请不要接受。它可能有用(它确实有用,这就是它获得 2 票赞成的原因)。但如果它没有解决你的问题,就不应该被接受。
  • @user1338194:说实话,不要那么快接受它。我感觉你也有点太快了the other related question yesterday
【解决方案3】:

您的函数添加的 span 标记会破坏由 chunk_split 创建的 HTML。

【讨论】:

    【解决方案4】:

    当您修改 DNS 字符串 $query 时,您需要区分核苷酸的位置和一般字符串偏移量。

    虽然起初两者是相同的,但添加到字符串中的越多,差异就越大。

    如果您将字符串封装到它自己的对象中,该对象负责处理 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 -->
    

    所以这里真正的魔力是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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-02
      • 1970-01-01
      • 2012-12-23
      相关资源
      最近更新 更多