|
Smarty
WARNING: All discussion is moving to https://reddit.com/r/smarty, please go there! This forum will be closing soon. |
|
View previous topic :: View next topic |
Author |
Message |
JasonDS Smarty Rookie
Joined: 25 Jan 2007 Posts: 25
|
Posted: Sun Feb 11, 2007 8:54 am Post subject: New Plugin: contains |
|
|
About: contains() finds the number of times a phrase is found in a string, and counts how many times it was found.
Usage: {$foo|contains:"bar"}
Optional Arguments: By default it isn't case-sensative, to make it case-sensative, add a second argument: {$foo|contains:"bar", true}
File: ..\libs\plugins\modifier.contains.php
Contents:
Code: |
<?php
/**
* Smarty shared plugin
* @package Smarty
* @subpackage plugins
*/
/**
* Function: smarty_contains
* Purpose: Used to find a string in a string
* Example: contains( 'Jason was here', 'here' ) returns true
* Example2: contains( 'Jason was here', 'ason' ) returns false
* @author Jason Strese <Jason dot Strese at gmail dot com>
* @param string
* @return string
*/
function smarty_modifier_contains($string, $find, $cases = false)
{
if(!empty($string) )
{
if($cases)
$string2 = str_replace( $find, null, $string );
else
$string2 = str_replace( strtolower($find), null, strtolower( $string ) );
$count = count( str_word_count( $string, 1 ) ) - count( str_word_count( $string2, 1 ) );
return $count;
}
return 0;
}
/* vim: set expandtab: */
?> |
Note: If you know booleans (true/false), you know that if something numerical is returned, and it is greater than 1, it is considered true, and if its below 1, it's false. So you can use this function a couple of ways:
Code: |
{if $foo|contains:"bar" > 5}
It contains it more than 5 times, resulting in {$foo|contains:"bar"} matches.
{/if}
{* OR *}
{if $foo|contains:"bar"}
It contained, 'bar'.
{/if}
{* OR *}
{assign var='count' value=$foo|contains:"bar"}
{if $count}
Contained it! ({$count} matches)
{/if}
{* Case-sensative demonstration *}
{if $foo|contains:"bar":true}
Case-sensative search returned {$foo|contains:"bar":true} results.
{/if}
|
|
|
Back to top |
|
joeri210 Smarty n00b
Joined: 04 May 2008 Posts: 1
|
Posted: Sun May 04, 2008 7:22 pm Post subject: Also for arrays |
|
|
Or something like this.. Little bit tweaked and can also be used for arrays.
Code: |
/**
* Smarty shared plugin
* @package Smarty
* @subpackage plugins
*/
/**
* Function: smarty_contains
* Purpose: Used to find a string in a string
* Example: contains( 'Jason was here', 'here' ) returns true
* Example2: contains( 'Jason was here', 'ason' ) returns false
* Usage string: {$foo|contains:"bar"}
* Usage array: {$foo|@contains:"bar"}
* @author Jason Strese <Jason dot Strese at gmail dot com>
* @param string
* @return string
*/
function smarty_modifier_contains($string, $find, $cases = false)
{
$count = 0;
if( is_string($string) && !empty($string) )
{
if($cases) $count = substr_count($string, $find);
else $count = substr_count(strtolower($string), strtolower($find) );
}
elseif( is_array($string) && count($string) )
{
if($cases)
{
foreach($string as $str) {
if($str == $find) $count++;
}
} else {
foreach($string as $str) {
if(strtolower($str) == strtolower($find)) $count++;
}
}
}
return $count;
}
/* vim: set expandtab: */
|
|
|
Back to top |
|
VTDIZ.COM Smarty n00b
Joined: 19 Jun 2008 Posts: 2
|
Posted: Thu Jun 19, 2008 7:20 pm Post subject: |
|
|
Thanks for this plugin! Very helpfull! _________________ support @ vividtemplates.net
support @ VTDIZ.COM |
|
Back to top |
|
huglester Smarty Rookie
Joined: 09 Oct 2008 Posts: 8
|
Posted: Wed Dec 03, 2008 5:53 am Post subject: |
|
|
Thank you. Nice plugin. |
|
Back to top |
|
mohrt Administrator
Joined: 16 Apr 2003 Posts: 7368 Location: Lincoln Nebraska, USA
|
Posted: Wed Dec 03, 2008 3:34 pm Post subject: |
|
|
Just glancing at the modifier, you might get more than you want. Example:
{$text|contains:"sock"}
If the word "socket" is in the text, you will get a match. That is probably not what you want. You could fix this with PCRE word boundaries (and at the same time, get rid of all the string replacing):
Code: | $find = preg_quote($find,'!');
if($cases)
$count = preg_match_all("!\b{$find}\b!",$string,$match);
else
$count = preg_match_all("!\b{$find}\b!i",$string,$match); |
Now the word (or phrase) must be surrounded by a word boundary.
Last edited by mohrt on Mon Sep 12, 2011 9:40 pm; edited 1 time in total |
|
Back to top |
|
frankc Smarty n00b
Joined: 21 Jul 2010 Posts: 2
|
Posted: Wed Jul 21, 2010 4:39 pm Post subject: problem with this |
|
|
as subject reads this is not working for me ... any help ?
where id_path is "1/13"
and category.category_id = "1"
{if $category_data.id_path|contains:"$category.category_id"}
{assign var="shomesomelov" value="visible"}
{$category_data.id_path} has {$category.category_id}
{else}
{assign var="shomesomelov" value="hidden"}
{/if}
code is
<ul class="menu-subcategories {$shomesomelov}" level="{$category.level}" bassin={$category_data.id_path} hold={$category.category_id}>
this is the output:
<ul hold="13" bassin="1/13" level="1" class="menu-subcategories hidden"> |
|
Back to top |
|
frankc Smarty n00b
Joined: 21 Jul 2010 Posts: 2
|
Posted: Wed Jul 21, 2010 4:53 pm Post subject: |
|
|
fixed:
neeeds the preg patch
Code: | Code:
$find = preg_quote($find);
if($cases)
$count = preg_match_all("!\b{$find}\b!",$string,$match);
else
$count = preg_match_all("!\b{$find}\b!i",$string,$match); |
|
|
Back to top |
|
ripley_one Smarty n00b
Joined: 12 Sep 2011 Posts: 1
|
Posted: Mon Sep 12, 2011 7:02 pm Post subject: |
|
|
GREAT! Thanks a lot! |
|
Back to top |
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|
|