Heim  >  Artikel  >  php教程  >  Implementierungscode für das Abfangen von PHP-HTML-Codezeichenfolgen

Implementierungscode für das Abfangen von PHP-HTML-Codezeichenfolgen

黄舟
黄舟Original
2016-12-14 13:19:331280Durchsuche

Und die angegebenen Daten sind eine HTML-Codezeichenfolge wie diese:

müssen Sie den Inhalt im div-Tag abfangen, das HTML-Tag behalten und nur den darin enthaltenen Text verarbeiten. Beispielsweise kann es sein, dass ich einfach das Wort „李“ in „李思“ abfange, aber wenn ich es auf diese Weise am Frontend einfüge, wird das Tag „a“ vor „李思“ nicht geschlossen, sodass ich nach dem Abfangen Sie müssen sicherstellen, dass die HTML-Syntax korrekt ist.

Dieses Problem ist wirklich nicht einfach zu lösen und es hat mich zwei Tage lang deprimiert. Bitte beachten Sie, dass es sich lediglich um eine Zeichenfolge handelt, der Inhalt jedoch HTML-Code ist und kein DOM vorhanden ist. Es wäre einfacher, wenn es am Frontend verarbeitet würde. Sie können das DOM direkt abrufen, dann die Knoten darin verarbeiten und schließlich Dinge wie innerHTML ausgeben. Es funktioniert jetzt nicht, ich muss meine Meinung ändern. Die Idee meines Kollegen ist folgende:

Jedes Zeichen der Zeichenfolge durchlaufen. Legen Sie ein Tag fest und setzen Sie es auf 1, wenn es am Anfang des Tags auf das Tag < trifft. Die folgenden Zeichen werden nicht gezählt und beginnen dann mit der Zählung, nachdem sie auf > gestoßen sind. Wenn Sie die Zeichenfolge innerhalb des Etiketts verarbeiten, müssen Sie zunächst feststellen, ob die Codierung des aktuellen Zeichens chinesisch sein kann. Im Allgemeinen beträgt die Länge der UTF-8-codierten chinesischen Zeichen in PHP 3. Wenn Sie also auf eine chinesische Zeichencodierung stoßen, I Ich muss zwei ungezählte überspringen ... An diesem Punkt fängt mein Kopf an, groß zu werden. Persönlich finde ich diese Methode sehr unangenehm. Erstens ist diese Art von exquisiter Logik nicht einfach zu kontrollieren, und die Länge des unter UFT-8-Codierung generierten Chinesisch kann 3 oder 4 betragen, sodass die Dichtheit des Codes fraglich ist .

Meine persönliche Idee ist die Verwendung von Tidy (bitte beachten Sie das PHP-Handbuch für die spezifische Verwendung). Ich habe gestern Tidy studiert und festgestellt, dass dieses Ding sehr nützlich ist. Konvertieren Sie diesen String zunächst wie folgt in ein Tidy-Objekt:

$tidy = Tidy_parse_string($str, array(), 'utf8′); // Beachten Sie, dass dies der Fall ist ist utf8, nicht utf-8, es gibt keine mittlere Verbindung.

Dann holen Sie sich den Körper in $tidy (da $tidy nach der Konvertierung automatisch Tags wie hinzufügt):

$body = Tidy_get_body($tidy) ;

Zu diesem Zeitpunkt können Sie var_dump verwenden, um sich einige $body-Strukturen anzusehen, und Sie werden feststellen, dass jedes Tag in ein entsprechendes Objekt mit entsprechenden Attributen umgewandelt wird. Beispielsweise sind einige Attribute, die einer solchen Anweisung entsprechen, beispielsweise sdf:

name=>“a“
value => "sdf"
child=> array{[0]=>Ein Textknotenobjekt, Wert ist sdf}
attribute=array{"href ”=>“#“}
…..Andere Attribute

Wie Sie sehen können, können wir den Wert des Textknotens unter dem Knoten, der der a-Beschriftung entspricht, tatsächlich separat verarbeiten, sodass er wird nicht zerstört. Keine HTML-Integrität. Ursprünglich dachte ich, dass sich nach dem Ändern des Werts des Textknotens im a-Label auch der Wert des a-Labels entsprechend ändern würde. In diesem Fall wäre es in Ordnung, wenn ich direkt den Wert des dem a entsprechenden Knotens zurückgeben würde Leider habe ich nicht damit gerechnet, dass der Text darin verarbeitet wird. Dann müssen Sie den neuen HTML-Code noch selbst buchstabieren.

Nachdem Sie die Struktur des Tidy-Objekts kennen, ist alles einfach zu handhaben. Für diese Anforderung müssen Sie das div-Tag finden und dann mit der Verarbeitung der darin enthaltenen Knoten beginnen. Der Code lautet wie folgt:

if(mb_strwidth($subchild->value, 'utf-8′) >= $len)
{
$subchild->value = mb_strimwidth ($subchild ->value, 0, $len, '…', 'utf-8′);
$trimed_str .= $subchild->value;
break;
}
else
{
$trimed_str .= $subchild->value;
$len = $len - mb_strwidth($subchild->value, 'utf-8′);
}

Das darin enthaltene $subchild ist ein untergeordneter Knoten. Beachten Sie, dass hier mb_strwidth verwendet wird, um die Stringlänge zu erhalten. Ich empfehle dieses mb_strwidth dringend, es ist sehr nützlich, es behandelt Chinesisch als zwei Zeichen lang, was genau den Anforderungen hier entspricht! Darüber hinaus wird mb_strimwidth beim Abfangen von Zeichenfolgen verwendet. Diese Funktion behandelt auch chinesische Zeichen mit einer Länge von zwei Zeichen. Die mit mb_ beginnenden Funktionen sind wirklich einfach zu verwenden.

Ich werde den spezifischen Code nicht aufschreiben, da er auf der Grundlage einer Anforderung geschrieben wurde und nicht in eine universelle Form gebracht wurde. Eines Tages habe ich Zeit, es universell zu machen und zu veröffentlichen.

Außerdem ist es schade, dass FireFox das Text-Overflow-Attribut nicht unterstützt, sonst müsste man sich nicht so viel Mühe geben, es im Hintergrund abzuschneiden. Wenn Sie eine bessere Methode haben, können Sie eine Nachricht zur Diskussion hinterlassen. Weitere verwandte Artikel finden Sie auf der chinesischen PHP-Website (www.php.cn)!


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