vb.org Archive

vb.org Archive (https://vborg.vbsupport.ru/index.php)
-   vB3 Programming Discussions (https://vborg.vbsupport.ru/forumdisplay.php?f=15)
-   -   Autolink strings in custom mod (https://vborg.vbsupport.ru/showthread.php?t=170144)

Tefra 02-10-2008 01:41 PM

Autolink strings in custom mod
 
I have created a custom terminology/glossary mod for vb, and i have also included a simple function to auto link to other terms. but i have two major issues. It breaks html tags.

Any help is appreciated, the preg_replace in line 15 is the vbulletin method to highlight strings, if that helps...

PHP Code:

function terms_build_relation($message$intermid 0)
{
    global 
$db;

    
$words         = array();
    
$keywords     $db->escape_string(strip_tags($message));
    
$sql         $db->query_read("SELECT term_id, term_title FROM ".VBSED_PREFIX."terms WHERE MATCH(term_title) AGAINST('$keywords') ".iif($intermid"AND term_id <> $intermid"'')." AND term_active = 1");
                    
    while(
$sim $db->fetch_array($sql)) {    $words[$sim['term_id']] = $sim['term_title']; }
    
    
$message str_replace('\"''"'$message);
    foreach (
$words AS $key => $rep)
    {
        if(
in_array(strtolower($rep), array('http''https''ftp'))) continue; //Not Good Enough
        
$message preg_replace('#(?<=[\s"\]>()]|^)(' $rep ')(([.,:;-?!()\s"<\[]|$))#siU''[term='.$key.']\\1[/term]\\2'$message1);
    }
    
$message ereg_replace('\\[term=([0-9]+)\\]([^\\[]*)\\[/term\\]''<em><a href="'.VBSED_TERMS_URL.'item=\\1">\\2</a></em>'$message);
    
$message ereg_replace('\\[term=([0-9]+)\\]([^\\[]*)\\[/term\\]''\\2'$message); // BUG Step 1!!! Remove any open term bbcode
    
return $message;    


The second issue is that sometimes it breaks into other autolinked terms, that's why in the end i replace any open term bbcode.

For example, there are the terms "system" and "system registry". In a 3rd term definition there is the string "system registry". In the first pass it replaces the "system" term but in the second pass it tries to replace the whole string "system registry" Here comes in hand the removal of the empty term bbcode. This isn't a great issue as the first one as i believe if the first issue is fixed this will also be gone.

You can check it out here
Here is an example breaking img tag with the tag parameter.

Tefra 02-12-2008 10:00 AM

Here is a different version which seems to be working better without breaking the original html tags at least. The process is based on this highlight function.

PHP Code:

function terms_build_relation($message$intermid 0)
{
    global 
$db;

    
$words         = array();
    
$keywords     $db->escape_string(strip_tags($message));
    
$sql         $db->query_read("SELECT term_id, term_title FROM ".VBSED_PREFIX."terms WHERE MATCH(term_title) AGAINST('$keywords') ".iif($intermid"AND term_id <> $intermid"'')." AND term_active = 1");            
    while(
$sim     $db->fetch_array($sql)) {    $words[$sim['term_id']] = $sim['term_title']; }
    
$message str_replace('\"''"'$message);
    
$pattern '#(?!<.*?)(%s)(?![^<>]*?>)#i';
    foreach (
$words AS $key => $word)
    {
        
$word         =     '\b' preg_quote($word) . '\b';
        
$replace     =     '<em><a href="'.VBSED_TERMS_URL.'item='.$key.'">\1</a></em>';
        
$search     =     sprintf($pattern$word);
        
$message     =     preg_replace($search$replace$message1);
    }
    return 
$message;    



cheesegrits 02-12-2008 04:19 PM

Personally I found it worth shelling out the 20 drinking vouchers on GALS, despite the slightly Beta-ish status and a few shortcomings. It works very well, has popup definitions as well as click throughs. And the stats keeping is interesting, being able to see how many folk actually click through to a given definition.

Maybe not as much fun as writing your own, but if you are pressed for time, definitely worth a look.

-- hugh

Tefra 02-12-2008 07:25 PM

Hrm the gals works with predefined keywords, the auto links in my case are produced dynamically with a query, this gives me the option to extend the autolinks to other sections custom pages, other mods etc etc

Well i don't want to pay for a whole product just to borrow some regex, more important i don't even know if it works like i want. With the last version of that function i solved my problem with broken html tags but there is still the occasional issue with the links over links.

e.g
PHP Code:

<em><a href="http://www.3dacc.net/terms.php?item=439"><em><a href="http://www.3dacc.net/terms.php?item=374">port</a></emscanning</a></em



All times are GMT. The time now is 10:02 AM.

Powered by vBulletin® Version 3.8.12 by vBS
Copyright ©2000 - 2025, vBulletin Solutions Inc.

X vBulletin 3.8.12 by vBS Debug Information
  • Page Generation 0.01623 seconds
  • Memory Usage 1,753KB
  • Queries Executed 10 (?)
More Information
Template Usage:
  • (1)ad_footer_end
  • (1)ad_footer_start
  • (1)ad_header_end
  • (1)ad_header_logo
  • (1)ad_navbar_below
  • (3)bbcode_php_printable
  • (1)footer
  • (1)gobutton
  • (1)header
  • (1)headinclude
  • (6)option
  • (1)post_thanks_navbar_search
  • (1)printthread
  • (4)printthreadbit
  • (1)spacer_close
  • (1)spacer_open 

Phrase Groups Available:
  • global
  • postbit
  • showthread
Included Files:
  • ./printthread.php
  • ./global.php
  • ./includes/init.php
  • ./includes/class_core.php
  • ./includes/config.php
  • ./includes/functions.php
  • ./includes/class_hook.php
  • ./includes/modsystem_functions.php
  • ./includes/class_bbcode_alt.php
  • ./includes/class_bbcode.php
  • ./includes/functions_bigthree.php 

Hooks Called:
  • init_startup
  • init_startup_session_setup_start
  • init_startup_session_setup_complete
  • cache_permissions
  • fetch_threadinfo_query
  • fetch_threadinfo
  • fetch_foruminfo
  • style_fetch
  • cache_templates
  • global_start
  • parse_templates
  • global_setup_complete
  • printthread_start
  • bbcode_fetch_tags
  • bbcode_create
  • bbcode_parse_start
  • bbcode_parse_complete_precache
  • bbcode_parse_complete
  • printthread_post
  • printthread_complete