Page 1 of 1
alternative to strpos
Posted: Mon Mar 09, 2015 8:04 pm
by Don Chambers
I want to know of a var begins with "blah". What I tried to use was:
Produces this error:
modifier 'strpos' not allowed by security setting <-- thrown in /home/content/html/bundled-libs/Smarty/libs/sysplugins/smarty_internal_templatecompilerbase.php on line 17
Re: alternative to strpos
Posted: Tue Mar 10, 2015 3:18 pm
by garvinhicking
Hi!
Only certain PHP functions are allowed in the core (see include/serendipity_smarty_class.inc.php, $php_modifiers).
The best way is in your config.inc.php file to register your own substring filter:
Code: Select all
function is_in_string($string, $search) {
if (strpos($string, $search) === 0) {
return true;
}
return false;
}
$serendipity['smarty']->registerPlugin('modifier', 'is_in_string', 'is_in_string');
And then use
HTH,
Garvin
Re: alternative to strpos
Posted: Tue Mar 10, 2015 4:23 pm
by Don Chambers
Awesome - will give that a try and report back.
Re: alternative to strpos
Posted: Tue Mar 10, 2015 9:46 pm
by Don Chambers
garvinhicking wrote:
And then use
Does that support multiple values? like 'blah','food','drink' ?
Re: alternative to strpos
Posted: Tue Mar 10, 2015 10:01 pm
by garvinhicking
No. One of those could:
Code: Select all
function is_in_string($string, $search) {
foreach($search AS $idx => $searchval) {
if (strpos($string, $searchval) === 0) {
return true;
}
}
return false;
}
Smarty usage: {$var|is_in_string:array('one','two','three')}
If that doesn'T work:
Code: Select all
function is_in_string($string, $search) {
$array = explode(',', $search);
foreach($array AS $idx => $searchval) {
if (strpos($string, $search) === 0) {
return true;
}
}
return false;
}
Smarty usage: {$var|is_in_string:'one,two,three'}
HTTH,
Garvin
Re: alternative to strpos
Posted: Tue Mar 10, 2015 10:27 pm
by Don Chambers
Thanks again Garvin. I'm trying to determine if an entry property contains an embedded video, in case you were wondering.
First suggestion error: "PHP function 'array' not allowed by security setting"
Second suggestion:
Code: Select all
{if $var|is_in_string:'<object,<embed,<iframe'}.
Doesn't return an error, but also does not evaluate as true.
In my very first attempt, prior to asking if it would support multiple values, I used this which worked:
Code: Select all
{if $var|is_in_string:'<object' || $var|is_in_string:'<embed || $var|is_in_string:'<iframe'}
Just seemed to be doing something three times that should be able to be done just once.
Re: alternative to strpos
Posted: Wed Mar 11, 2015 1:13 am
by Don Chambers
I found the problem. here is the corrected version:
Code: Select all
function is_in_string($string, $search) {
$array = explode(',', $search);
foreach($array AS $idx => $searchval) {
if (strpos($string, $searchval) === 0) {
return true;
}
}
return false;
}
in strpos(), $search needed to be $searchval.
Re: alternative to strpos
Posted: Wed Mar 11, 2015 3:35 pm
by garvinhicking
Ah! Sorry. Basic copy&paste mistake!
Re: alternative to strpos
Posted: Wed Mar 11, 2015 4:36 pm
by Don Chambers
No reason to be sorry. Could not have done it without your initial input!
Re: alternative to strpos
Posted: Fri May 14, 2021 2:37 pm
by hbarel
I actually tried my own function for replacing strpos.
I need it to strip the entire URL that comes as $tag from the tags plugin, and leave me with a simple text-only tag that I can add to the keyword metadata of the HTML header.
So I defined the following:
Code: Select all
function tag_from_link($tag) {
$ttag='';
if (strpos($tag,'title=')) {
$tit_s = strpos($tag,'title=')+7;
$tit_e = strpos($tag,'"',$tit_s+7);
$ttag = substr($tag,$tit_s,$tit_e-$tit_s);
}
return $ttag;
}
$serendipity['smarty']->registerPlugin('modifier', 'tag_from_link', 'tag_from_link');
I put this in the serendipity_config_local.inc.php, but all I get is an error: "Call to member function registerPlugin() on null"...
I sense that my mistake is trivial, but being a newbie I have no idea what it is...
Re: alternative to strpos
Posted: Sat May 15, 2021 12:06 am
by onli
Wouldn't really call this a replacement for strpos, more a function using it.
hbarel wrote: ↑Fri May 14, 2021 2:37 pm
I put this in the serendipity_config_local.inc.php, but all I get is an error: "Call to member function registerPlugin() on null"...
It's likely that `$serendipity['smarty']` is still null when you run your code.
serendipity_config_local.inc.php is executed very early, far before the moment the templates get interpreted. Put the code instead in the
config.inc.php of your theme, there smarty will already be initialized.
Re: alternative to strpos
Posted: Sat May 15, 2021 11:27 am
by hbarel
Excellent, thank you!
Indeed, I thought serendipity_config_local.inc.php might be a bit too early and causes the bug, but I did not realize there is a "later" config.inc.php with the template... Truthfully, I should have searched better...
P.S. You're right, the topic is not really strpos, but I figured I'd better post in the thread where the idea came from, rather than open a new thread...