Seite 1 von 2

[Acronym-Mod] Problem mit RegEx

Verfasst: 29.02.2008 13:21
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

Verfasst: 03.03.2008 17:22
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

Verfasst: 06.03.2008 18:39
von TomW
Kann denn wirklich keiner was dazu sagen? Dachte hier gibts einige php-Profis.

TomW

Verfasst: 06.03.2008 22:16
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:

Verfasst: 06.03.2008 22:48
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

Verfasst: 14.03.2008 14:25
von TomW
@Boecki91

Kannst du mir dabei nun helfen oder nicht?

TomW

Verfasst: 04.04.2008 17:16
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

Verfasst: 29.06.2008 19:39
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?

Verfasst: 30.06.2008 17:01
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.

Verfasst: 30.06.2008 17:07
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