Computer Hardware Forum - TweakPC

Computer Hardware Forum - TweakPC (https://www.tweakpc.de/forum/)
-   Programmiersprachen (https://www.tweakpc.de/forum/programmiersprachen/)
-   -   [PHP] Reguläre Ausdrücke - Replace nur außerhalb von Acronym-Tags (https://www.tweakpc.de/forum/programmiersprachen/81227-php-regulaere-ausdruecke-replace-nur-ausserhalb.html)

sofl 22.03.2011 14:08

[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.

Mother-Brain 22.03.2011 14:17

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

sofl 22.03.2011 14:40

AW: [PHP] Reguläre Ausdrücke - Replace nur außerhalb von Acronym-Tags
 
[quote=Mother-Brain;722643]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[/quote]

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]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;
}[/php]

Würde mich allerdings trotzdem über eine Lösung mit regulären Ausdrücken freuen.

mfg sofl

DonSchado 22.03.2011 19:33

AW: [PHP] Reguläre Ausdrücke - Replace nur außerhalb von Acronym-Tags
 
schau dir mal Rubular an. [url=http://www.rubular.com/]Rubular: a Ruby regular expression editor and tester[/url]
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. ;)

[B]edit[/B]: einfach mal auf "[I]try an example[/I]" klicken

Hoffe das hilt dir.
Lg

sofl 23.03.2011 10:26

AW: [PHP] Reguläre Ausdrücke - Replace nur außerhalb von Acronym-Tags
 
Ich schau mal drüber, Danke.

sevsh 19.12.2012 09:35

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).


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:25 Uhr.

Powered by vBulletin® Version 3.8.10 (Deutsch)
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
SEO by vBSEO 3.5.2 ©2010, Crawlability, Inc.