1

我想知道是否有标记第n个字符的好方法。目前我有这个代码,但它有一些缺陷。

$string ='Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ac arcu sit amet lorem mollis dignissim ac ut metus. Aliquam sed nulla ut risus sollicitudin luctus vitae eget quam. Nam velit diam, ullamcorper id tempus ac, iaculis sed arcu. Sed sed lectus rhoncus leo vehicula accumsan consequat a risus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Proin posuere, diam scelerisque suscipit accumsan, enim tortor lobortis sapien, a faucibus sapien metus eu erat. Phasellus condimentum elit ac nisi fringilla imperdiet. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris ac lectus quis lorem ornare ornare non vel nunc. Fusce et odio at leo interdum cursus eget sed magna. Nam convallis vehicula fermentum. Etiam turpis mauris, convallis et sollicitudin quis, rutrum in sapien. Suspendisse purus eros, sagittis vitae venenatis tincidunt, imperdiet molestie sem. Vestibulum eleifend urna vitae tortor suscipit consequat. Praesent placerat magna a ligula fringilla dapibus. Ut volutpat purus eu felis elementum eu laoreet nulla eleifend.';

echo mark_nth_char($string, 100);
function mark_nth_char($string, $pos, $prefixlen=10, $suffixlen=10, $fixchar='...') {
    $output = $fixchar;
    for ($i = $pos - $prefixlen ; $i < $pos + $suffixlen; $i++ ) {
        if ($i == $pos)
            $output .= '<b><font color="red">' . $string[$i] . '</font></b>';
        else 
            $output .= $string[$i];
    }
    return $output . $fixchar;
}

问题:

  1. 如果传递的数字小于 $prefixlen`,则会导致错误。
  2. 如果传递的数字超过总字符串长度,则会导致错误。
  3. 如果总字符串长度小于 和 的总和$prefixlen$suffixlen则不应添加它们。

我想在匹配字符(具有指定位置的字符)周围包含字符串。可能还有其他我不知道的问题,但不是解决这些问题,我想知道是否有更好的方法,可以以更有效和优雅的方式完成。

感谢你的信息。

4

2 回答 2

1

您的函数可能包含以下单个语句:if($pos<strlen($string) return substr($string,0,$pos-1).'<b><font color="red">' . $string{$pos-1} . '</font></b>'.substr($string,$pos+1)

于 2012-10-14T07:24:31.080 回答
0

好的,这似乎到目前为止有效。请让我知道它是否有缺陷。或任何改进建议将不胜感激。

$string ='123456789012345678901234567890';
echo '<p>' . mark_nth_char($string, 4) . '</p>';
echo '<p>' . mark_nth_char($string, 15) . '</p>';
echo '<p>' . mark_nth_char($string, 28) . '</p>';

$string = "Hello World.";
echo '<p>' . mark_nth_char($string, 10) . '</p>';
echo '<p>' . mark_nth_char($string, 6) . '</p>';

function mark_nth_char($string, $pos, $prefixlen=10, $suffixlen=10, $fixchar='...') {

    if (!($pos<strlen($string) && $pos > 0)) 
        return;

    // prefix
    $startpos = ($pos < $prefixlen) ? 0 : $pos - $prefixlen ;
    $length = ($pos < $prefixlen) ? $pos - 1 : $prefixlen - 1;
    $prefix = substr($string, $startpos, $length);
    if ($pos > $prefixlen) 
        $prefix = $fixchar . $prefix;

    // match
    $match = '<span style="background-color: FEE333; font-weight:bold; color:red; font-size : xx-large;">' . $string{$pos-1} . '</span>';

    // suffix
    $startpos = $pos;
    $suffix = substr($string, $startpos, $suffixlen);
    if (strlen($suffix) >= $suffixlen) 
        $suffix .= $fixchar;

    // output
    return $prefix . $match . $suffix;

}

我还想知道如何为该位置传递一个负数,以便它向后找到字符。但要编码它真的让我绞尽脑汁。

于 2012-10-14T09:11:00.057 回答