 |
22.03.2011, 14:08
|
#1 (permalink)
| | Overclocker
Registriert seit: 20.10.2005 Ort: Dresden
Beiträge: 381
| [PHP] Reguläre Ausdrücke - Replace nur außerhalb von Acronym-Tags Hallo Liebe Community!
Folgende Situation. Ich möchte in einem PHP-Script einen HTML Text, bzw. bestimmte Begriffe, mit Acronymtags versehen. Derzeitig tue ich das in einer Schleife.
Bsp.:
while begriffcount < max
suche & ersetze current_begriff mit <acronym title="current_beschreibung">current_begriff</acronym>
Die Beschreibung ist zu diesem Zeitpunkt bereits escaped, es kann also nicht passieren das das title-Attribut, durch nicht escapte quotes, geschlossen werden kann.
Mein Problem hierbei ist nun, dass wenn innerhalb der Beschreibung ein Begriff auftaucht, durch einfaches str_replace ein acronym im acronym ensteht.
Bsp.: <acronym title="<acronym title="....
Mein angedachter Lösungsansatz wäre nun ein preg_replace zu verwenden welcher das ersetzten innerhalb von acronym-Attributen und dem acronym-Content selbst untersagt und alles weitere ersetzt.
Leider bin ich in Sachen reguläre Ausdrücke kein Stück bewandert und habe auch im Internet nur Teillösungen gefunden die mir nicht weiter geholfen haben. Ich möchte auch keine HTML-Parser und/oder diverse Frameworks verwenden.
Kann mir eventuell jemand einen Denkanschub geben oder vllt sogar ein brauchbares Pattern basteln?
Danke.
mfg sofl. | | |
| |
22.03.2011, 14:17
|
#2 (permalink)
| | Hardware Freak
Registriert seit: 19.01.2009 Ort: Paderborn
Beiträge: 7.620
| AW: [PHP] Reguläre Ausdrücke - Replace nur außerhalb von Acronym-Tags vllt. ne einfache if Abfrage, ob das current_beschreibung zu einem "<acronym title=" werden würde?
So gut sind meine PHP Kentnisse leider auch nicht mehr, aber vllt. ist es ja nen Ansatz | | |
| | | Für diesen Beitrag bedankt sich: | |
22.03.2011, 14:40
|
#3 (permalink)
| | Overclocker
Registriert seit: 20.10.2005 Ort: Dresden
Beiträge: 381
| AW: [PHP] Reguläre Ausdrücke - Replace nur außerhalb von Acronym-Tags Zitat:
Zitat von Mother-Brain vllt. ne einfache if Abfrage, ob das current_beschreibung zu einem "<acronym title=" werden würde?
So gut sind meine PHP Kentnisse leider auch nicht mehr, aber vllt. ist es ja nen Ansatz | Hallo Mother Brain, danke für deine Antwort. Die Idee ist garnicht mal so schlecht. Allerdings müsste ich dann, (korrigiere mich wenn ich mich irre), eine verschachtelte Schleife bauen die bei jedem generieren eines Tags erneut schauen muss die Beschreibung, Begriffe aus der Liste enthält. Das würde unter Umständen ziemlich lange dauern da die Liste ziemlich groß ist und stetig wächst.
Ich habe mir derzeitig eine Notlösung gebaut. Ist zwar nicht die feine englische Art aber funktioniert. (Falls es wen interessieren sollte) PHP-Code: function fillWithAcronyms($all,$begriff,$besch,$pos=0){
$pos_begriff = stripos($all, $begriff,$pos);
if($pos_begriff===false)
return $all;
else
{
$pos_acstart = strripos(substr($all,0,$pos_begriff), '<acronym title="');
$pos_acend = strripos(substr($all,0,$pos_begriff), '</acronym>');
}
if($pos_acstart===false && $pos_acend===false)
{
$all=substr_replace($all, '<acronym title="'.$besch.'">'.$begriff.'</acronym>', $pos_begriff, strlen($begriff));
$all=fillWithAcronyms($all,$begriff,$besch,$pos_begriff);
}
elseif($pos_acstart!==false && $pos_acend!==false)
{
if($pos_acstart < $pos_acend)
{
$all=substr_replace($all, '<acronym title="'.$besch.'">'.$begriff.'</acronym>', $pos_begriff, strlen($begriff));
$all=fillWithAcronyms($all,$begriff,$besch,$pos_begriff);
}
else
$all=fillWithAcronyms($all,$begriff,$besch,$pos_begriff+strlen($begriff));
}
return $all;
}
Würde mich allerdings trotzdem über eine Lösung mit regulären Ausdrücken freuen.
mfg sofl | | |
| | | 2 Benutzer bedanken sich für den Beitrag: | |
22.03.2011, 19:33
|
#4 (permalink)
| | Stickstoff Junkie
Registriert seit: 03.01.2006 Ort: Köln
Beiträge: 3.208
| AW: [PHP] Reguläre Ausdrücke - Replace nur außerhalb von Acronym-Tags schau dir mal Rubular an. Rubular: a Ruby regular expression editor and tester
Da steht zwar "für Ruby", aber soweit ich weiß sind RegExp = RegExp...
Hat mir bei dem ein oder anderen Pattern schon sehr geholfen.
Vorallem weil man sich testweise (try&error)
an das passende Pattern herantasten kann. edit: einfach mal auf " try an example" klicken
Hoffe das hilt dir.
Lg | | |
| | | Für diesen Beitrag bedankt sich: | |
23.03.2011, 10:26
|
#5 (permalink)
| | Overclocker
Registriert seit: 20.10.2005 Ort: Dresden
Beiträge: 381
| AW: [PHP] Reguläre Ausdrücke - Replace nur außerhalb von Acronym-Tags Ich schau mal drüber, Danke. | | |
| |
19.12.2012, 09:35
|
#6 (permalink)
| | Neuling
Registriert seit: 19.12.2012
Beiträge: 5
| AW: [PHP] Reguläre Ausdrücke - Replace nur außerhalb von Acronym-Tags Auch wenn die Frage schon etwas älter ist, so ist der Sachverhalt doch ziemlich interessant.
Ich hätte auf Anhieb einen Ansatz, der nicht auf einem komplexen regulären Ausdruck basiert:
- du könntest den Text nach den vorhandenen Akronymen durchsuchen und in einen Array schreiben, wenn dies geschehen ist, ersetzt du nur noch die gefundenen Akronyme des Arrays im Text (so verhinderst du das durch ein ersetzen mit den neuen Beschreibungstexten neue Akronyme hinzukommen, da bereits dein Array mit den zu ersetzenden Akronymen besteht und keine weiteren hinzukommen können). | | |
| |  | |
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | | | | Themen-Optionen | | | | Ansicht | Thema bewerten | Linear-Darstellung | |
Forumregeln
| Es ist dir erlaubt, neue Themen zu verfassen. Es ist dir erlaubt, auf Beiträge zu antworten. Es ist dir nicht erlaubt, Anhänge hochzuladen. Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten. HTML-Code ist aus. | | | Alle Zeitangaben in WEZ +1. Es ist jetzt 15:37 Uhr. | | |