Eine Interviewfrage zum Abfangen von PHP-Strings

WBOY
Freigeben: 2016-09-21 14:13:10
Original
934 Leute haben es durchsucht

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

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>
Nach dem Login kopieren
Nach dem Login kopieren

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>
Nach dem Login kopieren
Nach dem Login kopieren

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>
Nach dem Login kopieren
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren
Verwandte Etiketten:
php
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage