[Acronym-Mod] Problem mit RegEx

Du hast Probleme beim Einbau oder bei der Benutzung eines Mods? In diesem Forum bist du richtig.
Forumsregeln
phpBB 2.0 hat das Ende seiner Lebenszeit überschritten
phpBB 2.0 wird nicht mehr aktiv unterstützt. Insbesondere werden - auch bei Sicherheitslücken - keine Patches mehr bereitgestellt. Der Einsatz von phpBB 2.0 erfolgt daher auf eigene Gefahr. Wir empfehlen einen Umstieg auf phpBB 3.0, welches aktiv weiterentwickelt wird und für welches regelmäßig Updates zur Verfügung gestellt werden.
TomW
Mitglied
Beiträge: 351
Registriert: 02.05.2002 22:55
Wohnort: Eichelsee
Kontaktdaten:

[Acronym-Mod] Problem mit RegEx

Beitrag von TomW »

Hallo,

Ich habe in meinem Forum den Acronym-Mod eingebaut, dieser zeigt mir zu bestimmten Begriffen eine Eklärung als Tooltip an, jetzt ist es so wenn das Wort Teil eines anderen Wortes ist, wird die Erklärung auch angezeigt, oder wenn das Wort in (url)(/url) steht dann wird der Teil bis zum dem Begriff als Link angezeigt und der Rest nicht mehr, ich hätte das gern so dass es bei Begriffen die in Beschreibungen von Links enthalten sind es keine Erklärung gibt.

Hier könnt Ihr euch das mal anschauen -> Klick

Und hier der Code der dafür verantwortlich ist.

Code: Alles auswählen

function acronym_pass($message)
{
   static $orig, $repl;

   if( !isset($orig) )
   {
      global $db, $board_config;
      $orig = $repl = array();

      $sql = 'SELECT * FROM ' . ACRONYMS_TABLE;
      if( !$result = $db->sql_query($sql) )
      {
         message_die(GENERAL_ERROR, "Couldn't obtain acronyms data", "", __LINE__, __FILE__, $sql);
      }
      
      $acronyms = $db->sql_fetchrowset($result);

      if( count($acronyms) )
      {
         usort( $acronyms, 'acronym_sort' );
      }

      for ($i = 0; $i < count($acronyms); $i++)
      {
             $orig[] = '#\b(' . phpbb_preg_quote( $acronyms[$i]['acronym'], "/") . ')\b# i';
            $descrip =$acronyms[$i]["description"];
            $acrony =  htmlentities($acronyms[$i]["acronym"], ENT_QUOTES);
            $repl[] = "<a class=acro href=\"lexikon.php?suchwort=". $acrony ."&suchen=1\" onmouseover=\"return overlib('". $descrip ."', STICKY, CAPTION, '". $acrony ."');\" onmouseout=\"return nd();\">" . $acrony . "</a>";
      }
   }
   
   if( count( $orig ) )
   {
      $segments = preg_split( '#(<a class=acro href=\"lexikon.php?suchwort=.+?>.+?</a>|<.+?>)#si' , $message, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);

      $message = '';

      foreach( $segments as $seg )
      {
         if( $seg[0] != '<' && $seg[0] != '[' )
         {
            $message .= str_replace('\"', '"', substr(preg_replace('#(\>(((?>([^><]+|(?R)))*)\<))#eis', "preg_replace(\$orig, \$repl, '\\0')", '>' . $seg . '<'), 1, -1));
         }
         else
         {
            $message .= $seg;
         }
      }
   }
   
   return $message;
}
Ich hoffe mir kann jemand bei meinem Problem helfen.

TomW
Computerprobleme??? -> http://www.weber-computerhilfe.de
TomW
Mitglied
Beiträge: 351
Registriert: 02.05.2002 22:55
Wohnort: Eichelsee
Kontaktdaten:

Beitrag von TomW »

Kann mir vielleicht jemand wenigstens diesen Teil erklären?

Code: Alles auswählen

$message .= str_replace('\"', '"', substr(preg_replace('#(\>(((?>([^><]+|(?R)))*)\<))#eis', "preg_replace(\$orig, \$repl, '\\0')", '>' . $seg . '<'), 1, -1));
TomW
Computerprobleme??? -> http://www.weber-computerhilfe.de
TomW
Mitglied
Beiträge: 351
Registriert: 02.05.2002 22:55
Wohnort: Eichelsee
Kontaktdaten:

Beitrag von TomW »

Kann denn wirklich keiner was dazu sagen? Dachte hier gibts einige php-Profis.

TomW
Computerprobleme??? -> http://www.weber-computerhilfe.de
Boecki91
Ehemaliges Teammitglied
Beiträge: 4744
Registriert: 18.06.2006 15:21

Beitrag von Boecki91 »

Was genau willst du da erklärt haben?

bei php.net findest du str_replace() erklährt ebenso wie
substr()
preg_replace()

Und für die RegEx findet sich über Google auch eine Erklärung :wink:
Standart: Am besten mit beiden Beinen auf dem Boden
Standardmäßig antworte ich nicht auf PMs
TomW
Mitglied
Beiträge: 351
Registriert: 02.05.2002 22:55
Wohnort: Eichelsee
Kontaktdaten:

Beitrag von TomW »

Boecki91 hat geschrieben:Was genau willst du da erklärt haben?
Ich würde gerne wissen wo ich denn genau das \b für die Wortgrenze hinsetzen muss, dass z.B: Auto aber nicht Autobahn oder Vorführauto ersetzt wird.

TomW
Computerprobleme??? -> http://www.weber-computerhilfe.de
TomW
Mitglied
Beiträge: 351
Registriert: 02.05.2002 22:55
Wohnort: Eichelsee
Kontaktdaten:

Beitrag von TomW »

@Boecki91

Kannst du mir dabei nun helfen oder nicht?

TomW
Computerprobleme??? -> http://www.weber-computerhilfe.de
TomW
Mitglied
Beiträge: 351
Registriert: 02.05.2002 22:55
Wohnort: Eichelsee
Kontaktdaten:

Beitrag von TomW »

Also ich habe es mittlerweile geschafft die Probleme selbst zu lösen, nur ein kleines Problem bleibt noch. Und zwar hatte ich ja das Problem dass er das Wort NAT in natürlich ersetzt hat was ja nicht sein sollte. Jetzt ist es so dass NAT in natuerlich NICHT ersetzt aber in natürlich ersetzt wird.

Also liegt irgendwo ein Problem mit dem ü, wie kann ich das beheben?
Jemand eine Idee?

TomW
Computerprobleme??? -> http://www.weber-computerhilfe.de
Benutzeravatar
Shauku
Mitglied
Beiträge: 120
Registriert: 20.11.2006 20:24

Beitrag von Shauku »

TomW hat geschrieben:Also ich habe es mittlerweile geschafft die Probleme selbst zu lösen, nur ein kleines Problem bleibt noch. Und zwar hatte ich ja das Problem dass er das Wort NAT in natürlich ersetzt hat was ja nicht sein sollte. Jetzt ist es so dass NAT in natuerlich NICHT ersetzt aber in natürlich ersetzt wird.

Also liegt irgendwo ein Problem mit dem ü, wie kann ich das beheben?
Jemand eine Idee?

TomW
ü ist ein Sonderzeichen. Was passiert bei nat-rlich, nat*rlich, natärlich, natörlich, etc. den? Erklär deinen Fix mal 8) . Wie hast du die anderen Probleme umgangen?
Athuran
Mitglied
Beiträge: 7
Registriert: 26.06.2008 20:22

Beitrag von Athuran »

Das mit den Umlauten ist echt dämlich, auch in phpbb3, wo ich das ganze gerade machen wollte, bin ich schließlich daran verzweifelt. Man glaubt gar nicht, wie oft Umlaute auftauchen...

Jedenfalls wurde das als Fehler der Software gemeldet (http://www.phpbb.com/bugs/phpbb3/ticket ... t_id=29705).
Wenn die Nutzung von Sonderzeichen also in der 3er Version immer noch problematisch ist, gebe ich keine Hoffnung darauf, dass das in 2 noch gelöst wird.

Wie aber hast du das Problem der Ersetzung in Links gelöst?
Würde mich auch interessieren.
TomW
Mitglied
Beiträge: 351
Registriert: 02.05.2002 22:55
Wohnort: Eichelsee
Kontaktdaten:

Beitrag von TomW »

Shauku hat geschrieben: ü ist ein Sonderzeichen.
Das ist mir schon klar. ;)
Shauku hat geschrieben: Was passiert bei nat-rlich, nat*rlich, natärlich, natörlich, etc. den?
Bei denen ist es das selbe Problem wie beim ü.
Shauku hat geschrieben: Erklär deinen Fix mal 8) .
Hier meine Lösung fürs URL-Problem. Ich suche hier einfach in den Segmenten nach <a href genauer eigentlich nur nach <a h und falls das vorkommt wird das Acronym nicht eingebaut.

Suche in der bbcode.php

Code: Alles auswählen

if( count( $orig ) )
   {
      $segments = preg_split( '#(<a class=acro href="lexikon.php?suchwort=.+?>.+?</a>|<.+?>)#si' , $message, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);

      $message = '';

      foreach( $segments as $seg )
      {
         if( $seg[0] != '<' && $seg[0] != '[' )
         {
            $message .= str_replace('"', '"', substr(preg_replace('#(\>(((?>([^><]+|(?R)))*)\<))#eis', "preg_replace(\$orig, \$repl, '\\0')", '>' . $seg . '<'), 1, -1));
         }
         else
         {
            $message .= $seg;
         }
      }
   }
   
   return $message;
}
und ersetze durch

Code: Alles auswählen

   if( count( $orig ) )
   {
   	 
      $segments = preg_split( '#(<a class=acro href="lexikon.php?suchwort=.+?>.+?</a>|<.+?>)#si' , $message, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);

      $message = '';
      $first_url = 0;
      $x = 0;
	
      foreach( $segments as $seg)
      {      
      	 if( $seg[0] == '<' && $seg[1] == 'a' && $seg[3] == 'h' )
      	 {    	 
      	 	$first_url = '1';
      	 	$x = 0;
      	 }
      	 if ($x < 3)
      	 {
      	 	$x = $x + 1;
      	 }
      	 else
      	 {
      	 	$first_url = 0;		
      	 }
      	 
         if( $seg[0] != '<' && $seg[0] != '[' )
         {
            if($first_url == '1')
            {
            	$message .= $seg;
            }
            else
            {
         		# Baut das Acronym ein
            	$message .= str_replace('"', '"', substr(preg_replace('#(\>(((?>([^><]+|(?R)))*)\<))#eis', "preg_replace(\$orig, \$repl, '\\0')", '>' . $seg . '<'), 1, -1));
            }
         }        
         else
         {
         	#Baut das <a href oder das </a> ein
            $message .= $seg;
         }
      }
   }
   
   return $message;
}
Shauku hat geschrieben: Wie hast du die anderen Probleme umgangen?
Welche meinst du?

Gruß TomW
Computerprobleme??? -> http://www.weber-computerhilfe.de
Antworten

Zurück zu „phpBB 2.0: Mod Support“