Heim  >  Artikel  >  Backend-Entwicklung  >  Eine Interviewfrage zum Abfangen von PHP-Strings

Eine Interviewfrage zum Abfangen von PHP-Strings

WBOY
WBOYOriginal
2016-09-21 14:13:10942Durchsuche

<code>$str = '这是<div>一道<a href="http://www.baidu.com">php字符串</a>截取题</div>。';
</code>

Schneiden Sie die ersten 7 Zeichen der obigen Zeichenfolge ab und zeigen Sie sie an. Das Endergebnis sollte wie folgt aussehen:

<code>'这是<div>一道<a href="http://www.baidu.com">php</a></div>'
</code>

Anforderungen:

  1. Wenn die Zeichenfolge HTML-Tags enthält, überspringen Sie diese

  2. Wenn HTML-Tags nach dem Abfangen abgeschnitten werden, müssen die abgeschnittenen Tags mit dem End-Tag am Ende hinzugefügt werden

Antwortinhalt:

<code>$str = '这是<div>一道<a href="http://www.baidu.com">php字符串</a>截取题</div>。';
</code>

Schneiden Sie die ersten 7 Zeichen der obigen Zeichenfolge ab und zeigen Sie sie an. Das Endergebnis sollte wie folgt aussehen:

<code>'这是<div>一道<a href="http://www.baidu.com">php</a></div>'
</code>

Anforderungen:

  1. Wenn die Zeichenfolge ein HTML-Tag enthält, ignorieren Sie es

  2. Wenn HTML-Tags nach dem Abfangen abgeschnitten werden, müssen die abgeschnittenen Tags mit dem End-Tag am Ende hinzugefügt werden

Ich habe nicht über den Zweck der Frage spekuliert, sondern einfach einen regulären Ersatz entsprechend den Anforderungen geschrieben

<code class="php">function pure_cut($str, $len) {
    $reg = '/' . str_repeat('[^<>]((?:<[^>]+>)+)?', $len) . '$/u';
    $str = preg_replace_callback($reg, function($matches) {
        array_shift($matches);
        $replace = join('', $matches);
        return $replace;
    }, $str, 7);
    return $str;
}

echo pure_cut($str, 7);</code>

Aber ich verstehe Anforderung 2 nicht ganz. Wenn Anforderung 1 erfüllt ist, wird das HTML-Tag nicht beschädigt und muss nicht repariert werden.

Es sollte den Inhalt des Rich-Text-Bearbeitungsfelds erfassen.

<code class="php"><?php 

$str = '这是<div>一道<a href="http://www.baidu.com">php字符串</a>截取题</div>。';

function truncate($text, $length = 100, $ending = '...', $exact = false, $considerHtml = true) {
    if ($considerHtml) {
            if (mb_strlen(strip_tags($text)) <= $length) {
                    return $text;
            }

            preg_match_all('/(<.+?>)?([^<>]*)/s', $text, $lines, PREG_SET_ORDER);
            $total_length = mb_strlen($ending);
            $open_tags = array();
            $truncate = '';

            foreach ($lines as $line_matchings) {
                    if (!empty($line_matchings[1])) {
                            if (preg_match('/^<(\s*.+?\/\s*|\s*(img|br|input|hr|area|base|basefont|col|frame|isindex|link|meta|param)(\s.+?)?)>$/is', $line_matchings[1])) {
                            } else if (preg_match('/^<\s*\/([^\s]+?)\s*>$/s', $line_matchings[1], $tag_matchings)) {
                                    $pos = array_search($tag_matchings[1], $open_tags);
                                    if ($pos !== false) {
                                    unset($open_tags[$pos]);
                                    }
                            } else if (preg_match('/^<\s*([^\s>!]+).*?>$/s', $line_matchings[1], $tag_matchings)) {
                                    array_unshift($open_tags, strtolower($tag_matchings[1]));
                            }
                            $truncate .= $line_matchings[1];
                    }
                    $content_length = mb_strlen(preg_replace('/&[0-9a-z]{2,8};|&#[0-9]{1,7};|[0-9a-f]{1,6};/i', ' ', $line_matchings[2]));
                    if ($total_length+$content_length > $length) {
                            $left = $length - $total_length;
                            $entities_length = 0;
                            if (preg_match_all('/&[0-9a-z]{2,8};|&#[0-9]{1,7};|[0-9a-f]{1,6};/i', $line_matchings[2], $entities, PREG_OFFSET_CAPTURE)) {
                                    foreach ($entities[0] as $entity) {
                                            if ($entity[1]+1-$entities_length <= $left) {
                                                    $left--;
                                                    $entities_length += mb_strlen($entity[0]);
                                            } else {
                                                    break;
                                            }
                                    }
                            }
                            $truncate .= mb_substr($line_matchings[2], 0, $left+$entities_length);
                            break;
                    } else {
                            $truncate .= $line_matchings[2];
                            $total_length += $content_length;
                    }
                    if($total_length >= $length) {
                            break;
                    }
            }
    } else {
            if (mb_strlen($text) <= $length) {
                    return $text;
            } else {
                    $truncate = mb_substr($text, 0, $length - mb_strlen($ending));
            }
    }
    if (!$exact) { 
            $spacepos = mb_strrpos($truncate, ' ');
            if (isset($spacepos)) {
                    $truncate = mb_substr($truncate, 0, $spacepos);
            }
    }
    $truncate .= $ending;
    if($considerHtml) {
            foreach ($open_tags as $tag) {
                    $truncate .= '</' . $tag . '>';
            }
    }
    return $truncate;
}

echo truncate($str, 7, '', true, true);</code>
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn