PDA

View Full Version : preg_replace - Exclude Text in Search Code Line - Posts Image Replacement Not Smilies


inciarco
07-23-2009, 02:36 AM
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:

$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

$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

$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? :confused:

$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? :confused:

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 (https://vborg.vbsupport.ru/showthread.php?p=1843304#post1843304), and I'll share the Solution to this Problem there also.

My Best Regards.

:)

Dismounted
07-23-2009, 06:03 AM
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.

Deceptor
07-23-2009, 06:15 AM
I agree with Dismounted, however as a temp solution here you go:
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.

inciarco
07-23-2009, 02:28 PM
I Appreciate Your Answers.

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? :confused:

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

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


--------------- Added 1248369401 at 1248369401 ---------------


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? :confused:

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

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. :confused:

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

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

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. :confused:

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:

if (is_member_of($this->registry->userinfo, 6))

{

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 1248376965 at 1248376965 ---------------

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:

// ################################################## ###########################

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:

if (is_member_of($this->registry->userinfo, 1,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 1248377122 at 1248377122 ---------------

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:

:)