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 に答える