Wie entferne ich Text zwischen Tags in PHP?

Lesezeit: 4 Minuten

Wie entferne ich Text zwischen Tags in PHP
MrFidge

Obwohl ich seit Jahren PHP verwende, habe ich nie wirklich gelernt, wie man Ausdrücke verwendet, um Strings richtig zu kürzen… was mich jetzt in den Hintern beißt!

Kann mir jemand beim Kürzen helfen? Ich muss den Textteil aus der URL herausschneiden und drehen

<a href="https://stackoverflow.com/questions/1361878/link.html">text</a>

hinein

<a href="https://stackoverflow.com/questions/1361878/link.html"></a>

$str = preg_replace('#(<a.*?>).*?(</a>)#', '$1$2', $str)

  • Obwohl dies funktioniert, möchten Sie HTML im Allgemeinen nicht mit Regexes analysieren. Karims Antwort ist vielleicht vorzuziehen.

    – Konerak

    3. Mai ’11 um 16:33

Wie entferne ich Text zwischen Tags in PHP
karim79

Verwenden von SimpleHTMLDom:

<?php
// example of how to modify anchor innerText
include('simple_html_dom.php');

// get DOM from URL or file
$html = file_get_html('http://www.example.com/');

//set innerText to null for each anchor
foreach($html->find('a') as $e) {
    $e->innerText = null;
}

// dump contents
echo $html;
?>

  • Nichts für ungut, aber diese Antwort ist 8 Jahre alt und niemand hat tatsächlich bemerkt, dass diese Antwort falsch ist und nicht funktioniert. Die foreach-Schleife hat keine Wirkung, wenn Sie einfach das Echo wiederholen $html. Ich kann nicht glauben, dass dies so viele Stimmen hat und niemand es tatsächlich getestet hat.

    – Kevin M

    16. August ’17 um 17:27

Was ist mit so etwas, wenn man bedenkt, dass Sie es vielleicht mit anderen wiederverwenden möchten? hrefS :

$str="<a href="https://stackoverflow.com/questions/1361878/link.html">text</a>";
$result = preg_replace('#(<a[^>]*>).*?(</a>)#', '$1$2', $str);
var_dump($result);

Was dir bringt:

string '<a href="https://stackoverflow.com/questions/1361878/link.html"></a>' (length=24)

(Ich gehe davon aus, dass du im OP einen Tippfehler gemacht hast?)

Wenn Sie keine anderen href-Angaben benötigen, können Sie Folgendes verwenden:

$str="<a href="https://stackoverflow.com/questions/1361878/link.html">text</a>";
$result = preg_replace('#(<a href="https://stackoverflow.com/questions/1361878/link.html">).*?(</a>)#', '$1$2', $str);
var_dump($result);

Was Ihnen auch bringt:

string '<a href="https://stackoverflow.com/questions/1361878/link.html"></a>' (length=24)

Als Randbemerkung: Versuchen Sie für komplexeres HTML nicht, reguläre Ausdrücke zu verwenden: Sie funktionieren gut für diese Art von einfachen Situationen, aber für einen echten HTML-Teil helfen sie im Allgemeinen nicht wirklich: HTML ist es nicht ziemlich “regelmäßig” “genug”, um von Regexes geparst zu werden.

1641780184 435 Wie entferne ich Text zwischen Tags in PHP
KB22

Sie könnten substring in Kombination mit stringpos verwenden, auch wenn dies kein sehr schöner Ansatz ist.

Überprüfen: PHP Manual – String-Funktionen

Eine andere Möglichkeit wäre, einen regulären Ausdruck zu schreiben, der Ihren Kriterien entspricht. Aber um Ihr Problem schnell zu lösen, reichen die String-Funktionen…

EDIT: Ich habe das Publikum unterschätzt. 😉 Mach weiter mit den Regexes… ^^

1641780184 661 Wie entferne ich Text zwischen Tags in PHP
mickmackusa

Sie müssen die Tags selbst nicht erfassen. Zielen Sie einfach auf den Text zwischen den Tags und ersetzen Sie ihn durch eine leere Zeichenfolge. Supereinfach.

Demo beider Techniken

Code:

$string = '<a href="https://stackoverflow.com/questions/1361878/link.html">text</a>';
echo preg_replace('/<a[^>]*>K[^<]*/', '', $string);
// the opening tag--^^^^^^^^  ^^^^^-match everything before the end tag
//                          ^^-restart fullstring match

Ausgabe:

<a href="https://stackoverflow.com/questions/1361878/link.html"></a>

Oder in Randfällen, wenn der Linktext a . enthält <, benutze das: ~<a[^>]*>K.*?(?=</a>)~

Dies vermeidet die Kosten für das Erfassen von Gruppen mit einem Lazy-Quantifier, dem Neustart des gesamten Strings K und ein “Vorausschauen”.


Älter und klüger:

Wenn Sie gültiges HTML parsen, sollten Sie aus Stabilitäts-/Genauigkeitsgründen einen dom-Parser verwenden. Regex ist DOM-ignorant, wenn es also einen Tag-Attributwert gibt, der a . enthält >, mein Snippet wird fehlschlagen.

Als eng geeignete domdocument-Lösung, um etwas Kontext zu bieten:

$dom = new DOMDocument;
$dom->loadHTML($string, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); // 2nd params to remove DOCTYPE);
$dom->getElementsByTagName('a')[0]->nodeValue="";
echo $dom->saveHTML();

1641780184 115 Wie entferne ich Text zwischen Tags in PHP
Jérôme Verstrynge

Benutz nur strip_tags(), das würde die Tags loswerden und nur den gewünschten Text dazwischen lassen

.

261840cookie-checkWie entferne ich Text zwischen Tags in PHP?

Wie entferne ich Text zwischen Tags in PHP?

Lesezeit: 4 Minuten

1641780184 936 Wie entferne ich Text zwischen Tags in PHP
MrFidge

Obwohl ich seit Jahren PHP verwende, habe ich nie wirklich gelernt, wie man Ausdrücke verwendet, um Strings richtig zu kürzen … was mich jetzt in den Hintern beißt!

Kann mir jemand beim Kürzen helfen? Ich muss den Textteil aus der URL herausschneiden und drehen

<a href="https://stackoverflow.com/questions/1361878/link.html">text</a>

hinein

<a href="https://stackoverflow.com/questions/1361878/link.html"></a>

$str = preg_replace('#(<a.*?>).*?(</a>)#', '$1$2', $str)

  • Obwohl dies funktioniert, möchten Sie HTML im Allgemeinen nicht mit Regexes analysieren. Karims Antwort ist vielleicht vorzuziehen.

    – Konerak

    3. Mai ’11 um 16:33

1641780184 325 Wie entferne ich Text zwischen Tags in PHP
karim79

Verwenden von SimpleHTMLDom:

<?php
// example of how to modify anchor innerText
include('simple_html_dom.php');

// get DOM from URL or file
$html = file_get_html('http://www.example.com/');

//set innerText to null for each anchor
foreach($html->find('a') as $e) {
    $e->innerText = null;
}

// dump contents
echo $html;
?>

  • Nichts für ungut, aber diese Antwort ist 8 Jahre alt und niemand hat tatsächlich bemerkt, dass diese Antwort falsch ist und nicht funktioniert. Die foreach-Schleife hat keine Wirkung, wenn Sie einfach das Echo wiederholen $html. Ich kann nicht glauben, dass dies so viele Stimmen hat und niemand es tatsächlich getestet hat.

    – Kevin M

    16. August ’17 um 17:27

Was ist mit so etwas, wenn man bedenkt, dass Sie es vielleicht mit anderen wiederverwenden möchten? hrefS :

$str="<a href="https://stackoverflow.com/questions/1361878/link.html">text</a>";
$result = preg_replace('#(<a[^>]*>).*?(</a>)#', '$1$2', $str);
var_dump($result);

Was dir bringt:

string '<a href="https://stackoverflow.com/questions/1361878/link.html"></a>' (length=24)

(Ich gehe davon aus, dass du im OP einen Tippfehler gemacht hast?)

Wenn Sie keine anderen href-Angaben benötigen, können Sie Folgendes verwenden:

$str="<a href="https://stackoverflow.com/questions/1361878/link.html">text</a>";
$result = preg_replace('#(<a href="https://stackoverflow.com/questions/1361878/link.html">).*?(</a>)#', '$1$2', $str);
var_dump($result);

Was Ihnen auch bringt:

string '<a href="https://stackoverflow.com/questions/1361878/link.html"></a>' (length=24)

Als Randbemerkung: Versuchen Sie für komplexeres HTML nicht, reguläre Ausdrücke zu verwenden: Sie funktionieren gut für diese Art von einfachen Situationen, aber für einen echten HTML-Teil helfen sie im Allgemeinen nicht wirklich: HTML ist es nicht ziemlich “regelmäßig” “genug”, um von Regexes geparst zu werden.

1641780184 645 Wie entferne ich Text zwischen Tags in PHP
KB22

Sie könnten substring in Kombination mit stringpos verwenden, auch wenn dies kein sehr schöner Ansatz ist.

Überprüfen: PHP Manual – String-Funktionen

Eine andere Möglichkeit wäre, einen regulären Ausdruck zu schreiben, der Ihren Kriterien entspricht. Aber um Ihr Problem schnell zu lösen, reichen die String-Funktionen…

EDIT: Ich habe das Publikum unterschätzt. 😉 Mach weiter mit den Regexes… ^^

1641780184 345 Wie entferne ich Text zwischen Tags in PHP
mickmackusa

Sie müssen die Tags selbst nicht erfassen. Zielen Sie einfach auf den Text zwischen den Tags und ersetzen Sie ihn durch eine leere Zeichenfolge. Supereinfach.

Demo beider Techniken

Code:

$string = '<a href="https://stackoverflow.com/questions/1361878/link.html">text</a>';
echo preg_replace('/<a[^>]*>K[^<]*/', '', $string);
// the opening tag--^^^^^^^^  ^^^^^-match everything before the end tag
//                          ^^-restart fullstring match

Ausgabe:

<a href="https://stackoverflow.com/questions/1361878/link.html"></a>

Oder in Randfällen, wenn der Linktext a . enthält <, benutze das: ~<a[^>]*>K.*?(?=</a>)~

Dies vermeidet die Kosten für das Erfassen von Gruppen mit einem Lazy-Quantifier, dem Neustart des gesamten Strings K und ein “Vorausschauen”.


Älter und klüger:

Wenn Sie gültiges HTML parsen, sollten Sie aus Stabilitäts-/Genauigkeitsgründen einen dom-Parser verwenden. Regex ist DOM-ignorant, wenn es also einen Tag-Attributwert gibt, der a . enthält >, mein Snippet wird fehlschlagen.

Als eng geeignete domdocument-Lösung, um etwas Kontext zu bieten:

$dom = new DOMDocument;
$dom->loadHTML($string, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); // 2nd params to remove DOCTYPE);
$dom->getElementsByTagName('a')[0]->nodeValue="";
echo $dom->saveHTML();

1641780184 910 Wie entferne ich Text zwischen Tags in PHP
Jérôme Verstrynge

Benutz nur strip_tags(), das würde die Tags loswerden und nur den gewünschten Text dazwischen lassen

.

261850cookie-checkWie entferne ich Text zwischen Tags in PHP?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy