2016-04-18 12 views
0

Ich muss bestimmte Tags und Text zwischen ihnen entfernen. Für Tags kann ich str_replace verwenden, aber für Text zwischen versuche ich preg_replace, aber nichts funktioniert.PHP - löschen Inhalt nach und vor bestimmten Tag

-Code zu beheben:

// ... 
[tabs_item title=”My title”] some different text here... [/tabs_item] 
[tabs_item title=”My Other title”] some different text here... [/tabs_item] 
// ... 

mein Code:

$pattern = "/[tabs_item[^>]*title=\"my txt\"](.*?)[\\/tabs_item]/si"; 
$replacement = ''; 
$fix1 = preg_replace($pattern, $replacement, $content2); 

$search = array('[/tabs_item]'); 
$replace = array(''); 
$fix2 = str_replace($search, $replace, $fix1); 

return $fix2; 
+0

Sie haben '“ 'in Ihrem "Code zu beheben". Dies sind keine gültigen Anführungszeichen für HTML-Text (ish). Lass deine Sachen nicht durch einen Textverarbeitungsprozessor laufen - es wird Code durchgehen, als gäbe es kein Morgen. Verwenden Sie einen geeigneten Text/Code-Editor. –

+0

Warum verwenden Sie '[^>] *' in Ihrem Muster? –

+0

Was ist Ihre erwartete Ausgabe? Ist es "ein anderer Text hier ..."? – Andreas

Antwort

0

Vielen Dank für das Posten des vollständigen Codes. Dies muss etwas anders gehandhabt werden, da HTML in Ihrem Inhalt vorhanden ist.

Erstens, weil Ihr Inhalt das/char enthält, müssen wir das Regex-Trennzeichen zu etwas anderem ändern, damit es nicht stört. Ich habe es in% geändert. Da Sie eine mehrzeilige Zeichenfolge verwenden, müssen Sie als Nächstes einen Modifikator für die Regex festlegen, um Zeilenumbrüche in die Zeichenfolge ".dot: all chars" einzufügen. Dieser Modifikator wird hinzugefügt, indem Sie nach dem abschließenden Begrenzer das 's' am Ende des Musters hinzufügen.

Dieser Code ist getestet und funktionierte für mich.

$content = ' 
    <p>[tabs] [tabs_item title="Description"]<br /> 
    Lorem ipsum dolor sit amet</p> 
    <p>Lorem ipsum dolor sit amet<br /> 
    Lorem ipsum dolor sit amet<br /> 
    Lorem ipsum dolor sit amet</p> 
    <p>[/tabs_item] [tabs_item title="Zwroty"]</p> 
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce nec mauris nunc. Vestibulum elit urna, aliquet et urna et, sagittis blandit ligula.</p> 
    [/tabs_item] 
    <p>[tabs_item title="Peyment and shipping"]</p> 
    <p>Lorem ipsum dolor sit amet</p> 
    <p><b>Lorem ipsum dolor sit amet</b>Lorem ipsum dolor sit amet</p> 
    <p>Lorem ipsum dolor sit amet</p> 
    <p>Lorem ipsum dolor sit amet</p> 
    <p>Lorem ipsum dolor sit amet</p> 
    <p>Lorem ipsum dolor sit amet " <a href="#" target="_blank">url</a>"</p> 
    <p>[/tabs_item]</p> 
    <p>[/tabs]</p>'; 

$pattern = "%\[tabs_item[^\[]+\[/tabs_item\]%s"; 
$replacement = ''; 
$out = preg_replace($pattern, $replacement, $content); 

echo $out; 

Ergebnisse in:

<p>[tabs] 
    <p></p> 
    <p>[/tabs]</p> 

Ihre followup Frage beantworten:

[tabs_item title = "peyment und Versand"] ... [: Wenn Sie nur diesen Tag entfernen mögen/tabs_item]

Sie Ihr Muster ändern können:

$pattern = '%\[tabs_item title="Peyment and shipping"\][^\[]+\[/tabs_item\]%s'; 

was zur Folge hat:

<p>[tabs] [tabs_item title="Description"]<br /> 
    Lorem ipsum dolor sit amet</p> 
    <p>Lorem ipsum dolor sit amet<br /> 
    Lorem ipsum dolor sit amet<br /> 
    Lorem ipsum dolor sit amet</p> 
    <p>[/tabs_item] [tabs_item title="Zwroty"]</p> 
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce nec mauris nunc. Vestibulum elit urna, aliquet et urna et, sagittis blandit ligula.</p> 
    [/tabs_item] 
    <p></p> 
    <p>[/tabs]</p> 
+0

Ich habe Fehler: Warnung: preg_replace(): Trennzeichen darf nicht alphanumerisch oder Backslash in – AQ404

+0

sein Ich habe vergessen, das Trennzeichen hinzuzufügen. Ich habe meine Antwort aktualisiert. Ich hoffe, das hilft. –

+0

Kein Fehler dieses Mal, aber auch ohne Wirkung;/Ich habe meinen vollständigen Code – AQ404

0

Wenn Sie keine regexp Geschick haben Sie diese mit Funktion wie diese explodieren können;

<?php 

$var = '// something 
[tabs_item title=”My title”] some different text here... [/tabs_item] 
[tabs_item title=”My Other title”] some different text here... [/tabs_item] 
// something'; 

$first = explode('[tabs_item title=”My title”]',$var); 
$start = $first[0]; 
$last = explode('[/tabs_item]',$first[1]); 
$end = $last[count($last)-1]; 
echo $start.$end; 

?> 
+0

Ich habe das versucht - aber es funktioniert nicht richtig, es entfernt den gesamten Inhalt von beiden vor [Tabs_item title = "Mein Titel"] und nach [/ Tabs_item] auch;/ – AQ404

+0

@ AQ404 auch brauchen Sie zwischen dem Tag ? Eigentlich funktioniert dieser Code wie auf deiner Frage was du brauchst. – merdincz

+0

mein voller PHP-Code (php + Wordpress) mit Ihrem Vorschlag ' 'Funktioniert nicht – AQ404

Verwandte Themen