Go Back   vb.org Archive > vBulletin 3 Discussion > vB3 Programming Discussions
FAQ Community Calendar Today's Posts Search

Reply
 
Thread Tools Display Modes
  #1  
Old 07-23-2009, 02:36 AM
inciarco's Avatar
inciarco inciarco is offline
 
Join Date: Mar 2007
Posts: 758
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default preg_replace - Exclude Text in Search Code Line - Posts Image Replacement Not Smilies

preg_replace - Exclude Text in Search Code Line - Posts Image Replacement Not Smilies

Hello.

I'm trying to Create a Plugin to Replace the Images on the Posts for a Text.

For that I'm using the "postbit_display_complete" Hook Location.

The Code I'm Using is the Following:

Quote:
$bbcodeimgtag_search = '#(<img[^>])(.*)(website.com)(.*)(</img>|\/>)#i';

$bbcodeimgtag_replace = 'Text To Replace';

$this->post['message'] = preg_replace($bbcodeimgtag_search, $bbcodeimgtag_replace, $this->post['message'].' ');
This Code Replaces all the Images that Include website.com in the HTML img Tag.

I'd like to do the Opposite; that the Code Replace all the Images that don't Include website.com in the HTML img Tag.

I've tried

Quote:
$bbcodeimgtag_search = '#(<img[^>])(.*)([^(website.com)])(.*)(</img>|\/>)#i';
Using the [^(website.com)], but that didn't Work.

The Idea is to Exclude the Images that have in the URL the website.com (the Forum Website) for the Plugin not to Replace the Images that are Stored in the Server, like the Smilies, actually the Smilies are the ones I'm trying to Display.

This Plugin with

Quote:
$bbcodeimgtag_search = '#(<img[^>])(.*)(</img>|\/>)#i';
Disables All the Images in the Posts, but what I'm trying to do is Not to Disable the Smilies.

1. How can I rewrite the Following Line to Exclude img URLs that have the website.com in their URL?

Quote:
$bbcodeimgtag_search = '#(<img[^>])(.*)(website.com)(.*)(</img>|\/>)#i';
2. Perhaps Do You Know a Better Way (Plugin) to Replace the Images in the Posts but Not the Smilies?

This is a Very Useful Plugin; I Appreciate Your Help to Solve this Problem, and I Hope this Plugin can be Useful in Your Boards.

I've already shared some Plugings on This Mod, and I'll share the Solution to this Problem there also.

My Best Regards.

Reply With Quote
  #2  
Old 07-23-2009, 06:03 AM
Dismounted's Avatar
Dismounted Dismounted is offline
 
Join Date: Jun 2005
Location: Melbourne, Australia
Posts: 15,047
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

A better solution may be to alter the BB code handler for the IMG tag (see the last bit of class_bbcode.php). This would allow the post to be cached, and would relieve the need to run multiple preg_replace's, which are relatively slow.
Reply With Quote
  #3  
Old 07-23-2009, 06:15 AM
Deceptor's Avatar
Deceptor Deceptor is offline
 
Join Date: Dec 2008
Location: England
Posts: 514
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

I agree with Dismounted, however as a temp solution here you go:
PHP Code:
if (!function_exists('check_image_src'))
{
    function 
check_img_src($tag$src)
    {
        static 
$blacklisted;

        if (!
$blacklisted)
        {
            
$blacklisted = array(
                
'website1.com',
                
'website2.com',
                
'website3.com',
            );
        }

        foreach (
$blacklisted as $bl)
        {
            if (
strstr($src$bl))
            {
                return 
'';
            }
        }

        return 
stripslashes($tag);
    }
}

$this->post['message'] = preg_replace("#(<img src=\"(.*[^\"])\" border=\"0\" alt=\"\" />)#e""check_img_src('\\1', '\\2')"$this->post['message']); 
I would not recommend using this long-term, just adjust the array in the code to add additional websites to the blacklist. Your smilies should be unaffected even if you block your own forums domain.
Reply With Quote
  #4  
Old 07-23-2009, 02:28 PM
inciarco's Avatar
inciarco inciarco is offline
 
Join Date: Mar 2007
Posts: 758
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

I Appreciate Your Answers.

Quote:
Originally Posted by Dismounted View Post
A better solution may be to alter the BB code handler for the IMG tag (see the last bit of class_bbcode.php). This would allow the post to be cached, and would relieve the need to run multiple preg_replace's, which are relatively slow.
How can this be done Dismounted?

What Code Edits should I do on the File for it to Work?

If I wish to Apply the Code Edits to Specific Usergroups what Additional Code Lines should I add on the "class_bbcode.php" file?


--------------- Added [DATE]1248369401[/DATE] at [TIME]1248369401[/TIME] ---------------


Hello Deceptor and Dismounted.

I managed to make some Changes in the Code, and it's working with some Errors/Bugs; I hope you can point me into the Solution.

Perhaps is there a way to Locate the Function where it can be Processed Only Once, and then Used by the "postbit_display_complete" Plugin?

If so, where should I locate the Function, and how should I write it in that Location?

I think we're very Close, the Problem is that the Function is being Declared more than Once on the Threads and for some reasons on some Forums (perhaps because of the Previous Text that is prepared and displayed when placing the cursor over the Threads.

Is there a way to Undeclare the Function after every time the Plugin is Runned?

- 1. On Threads with more than 1 Post, I get an Error Message:

Quote:
Fatal error: Cannot redeclare check_img_src() (previously declared in /home/zzz/public_html/zzz/includes/class_postbit.php(293) : eval()'d code:605) in /home/zzz/public_html/zzz/includes/class_postbit.php(293) : eval()'d code on line 605
- 2. When Trying to Access some Forums I get the same previous Error and in some Other Forums Not.

Quote:
Fatal error: Cannot redeclare check_img_src() (previously declared in /home/zzz/public_html/zzz/includes/class_postbit.php(293) : eval()'d code:605) in /home/zzz/public_html/zzz/includes/class_postbit.php(293) : eval()'d code on line 605
This is the Changed Code, in this case I choosed to Whitelist the Web Sites which is the Objective, that the Smilies and other Images Located in the Same Server get Displayed.

As you can notice, I've set this Plugin to Work only on the Usergroup 6, which is the Admin Usergroup, to be able to Test it without Affecting other Usergroups; after it's working properly I'll set this to 1,3,4,8 Usergroups.

"postbit_display_complete" Plugin:

PHP Code:
if (is_member_of($this->registry->userinfo6))

{

if (!
function_exists('check_image_src')) 

    function 
check_img_src($tag$src
    { 
        static 
$whitelisted

        if (!
$whitelisted
        { 
            
$whitelisted = array( 
                
'website1.com'
                
'website2.com'
                
'website3.com'
            ); 
        } 

        foreach (
$whitelisted as $bl
        { 
            if (
strstr($src$bl)) 
            { 
                return 
stripslashes($tag); 
            } 
        } 

        return 
'Cannot Display Image'

    




$this->post['message'] = preg_replace("#(<img[^>](.*)(</img>|\/>))#e""check_img_src('\\1', '\\2')"$this->post['message']);  



My Best Regards.



--------------- Added [DATE]1248376965[/DATE] at [TIME]1248376965[/TIME] ---------------

I'd like to Share a Solution I Found for the Previously Explained Problem; now the Images are Replaced by a Text and the Smilies and other Images on the image Folder are being Displayed. :up:

On the File /includes/class_postbit.php

you should add at the End of it, right after the "}" of the Last Function:

PHP Code:
// #############################################################################

function check_img_src($tag$src


$whitelisted = array( 
                
'website.com/forum/images'
                
'website.com/forum/location2',
                
'website.com/forum/location3',
                ); 

        foreach (
$whitelisted as $bl
        { 
            if (
strstr($src$bl)) 
            { 
                return 
stripslashes($tag); 
            } 
        } 

        return 
'Text Or Code Displayed Instead Of The Images Inserted With IMG Tag';


You Should Create a Plugin as Follows:

Product: vBulletin
Hook Location: postbit_display_complete
Title: IMG BBCode Permissions For Usergroups - postbit_display_complete
(or the one you wish)
Execution Order: 5
Active Plugin: Yes

PHP Code:

PHP Code:
if (is_member_of($this->registry->userinfo1,3,4,8))

{


$this->post['message'] = preg_replace("#(<img[^>](.*)(</img>|\/>))#e""check_img_src('\\1', '\\2')"$this->post['message']);  



You can Replace the 1,3,4,8 with the Usergroup Numbers you wish the Images Not to be Displayed, but Yes the Smilies.

And Thats It... Enjoy.

My Best Regards.



--------------- Added [DATE]1248377122[/DATE] at [TIME]1248377122[/TIME] ---------------

I Appreciate the Help of Deceptor for Providing the Code I Could Take as a Great Idea to Edit and Post my Solution, and to Dismounted who gave me on his Post the Idea to Include the Function in the php File. :up:

Of course, if you could share a Better Way to do this I'd appreciate it a Lot.

My Best Regards to Both of You. :up:

Reply With Quote
Reply


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT. The time now is 07:06 PM.


Powered by vBulletin® Version 3.8.12 by vBS
Copyright ©2000 - 2024, vBulletin Solutions Inc.
X vBulletin 3.8.12 by vBS Debug Information
  • Page Generation 0.04128 seconds
  • Memory Usage 2,234KB
  • Queries Executed 13 (?)
More Information
Template Usage:
  • (1)SHOWTHREAD
  • (1)ad_footer_end
  • (1)ad_footer_start
  • (1)ad_header_end
  • (1)ad_header_logo
  • (1)ad_navbar_below
  • (1)ad_showthread_beforeqr
  • (1)ad_showthread_firstpost
  • (1)ad_showthread_firstpost_sig
  • (1)ad_showthread_firstpost_start
  • (4)bbcode_php
  • (7)bbcode_quote
  • (1)footer
  • (1)forumjump
  • (1)forumrules
  • (1)gobutton
  • (1)header
  • (1)headinclude
  • (1)navbar
  • (3)navbar_link
  • (120)option
  • (4)post_thanks_box
  • (4)post_thanks_button
  • (1)post_thanks_javascript
  • (1)post_thanks_navbar_search
  • (4)post_thanks_postbit_info
  • (4)postbit
  • (4)postbit_onlinestatus
  • (4)postbit_wrapper
  • (1)spacer_close
  • (1)spacer_open
  • (1)tagbit_wrapper 

Phrase Groups Available:
  • global
  • inlinemod
  • postbit
  • posting
  • reputationlevel
  • showthread
Included Files:
  • ./showthread.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/functions_bigthree.php
  • ./includes/class_postbit.php
  • ./includes/class_bbcode.php
  • ./includes/functions_reputation.php
  • ./includes/functions_post_thanks.php 

Hooks Called:
  • init_startup
  • init_startup_session_setup_start
  • init_startup_session_setup_complete
  • cache_permissions
  • fetch_postinfo_query
  • fetch_postinfo
  • fetch_threadinfo_query
  • fetch_threadinfo
  • fetch_foruminfo
  • style_fetch
  • cache_templates
  • global_start
  • parse_templates
  • global_setup_complete
  • showthread_start
  • showthread_getinfo
  • forumjump
  • showthread_post_start
  • showthread_query_postids
  • showthread_query
  • bbcode_fetch_tags
  • bbcode_create
  • showthread_postbit_create
  • postbit_factory
  • postbit_display_start
  • post_thanks_function_post_thanks_off_start
  • post_thanks_function_post_thanks_off_end
  • post_thanks_function_fetch_thanks_start
  • post_thanks_function_fetch_thanks_end
  • post_thanks_function_thanked_already_start
  • post_thanks_function_thanked_already_end
  • fetch_musername
  • postbit_imicons
  • bbcode_parse_start
  • bbcode_parse_complete_precache
  • bbcode_parse_complete
  • postbit_display_complete
  • post_thanks_function_can_thank_this_post_start
  • tag_fetchbit_complete
  • forumrules
  • navbits
  • navbits_complete
  • showthread_complete