[Templates] [Fwd: [Dbix-class] Re: Replace with case insensitive]
Harald Joerg
harald.joerg at fujitsu-siemens.com
Mon Mar 3 11:43:30 GMT 2008
Emmanuel Quevillon asks:
> [...]
> Harald Joerg wrote:
>> Emmanuel Quevillon writes:
>>
>>> Hi,
>>>
>>> I am using TT to render DB output from search query box.
>>> As I allow insensitive search, I'd like to bold the search
>>> term in the output html page.
>>> I can do it using replace vmethod but I did not find any
>>> insensitive option to render it:
>>>
>>> [% entry.dbid.replace(query, "<b>$query</b>") %]
>>> If the query is "foo" and the db value is "Foo", the
>>> replace doe snot work.
>>> Does it exist a way to allow this functionality?
>>
>> Yep!
>>
>> The search string of the replace vmethod can contain all modifiers
>> which are allowed in perl itself. The only additional trick you need
>> to use is to interpolate your variable into the regular expression:
>>
>> [% entry.dbid.replace("(?i:$query)", "<b>$query</b>") %]
>>
>> You did already take care for oddities like pattern metacharacters in
>> your query variable, did you? ;-)
> Hi Harald,
>
> Thanks for your help.
> Also is there a possibility to $1 etc in replace method?
> Something like:
> [% entry.dbid.replace("(?i:$query)", "<b>$1</b>") %]
Yes, there is!
Two things to take into account:
1) (?i:...) doesn't create a backreference for $1, so use an extra
pair of parens around your search string.
2) Use single quotes instead of double quotes in the replace string,
because $1 is not a TT variable.
[% entry.dbid.replace("((?i:$query))", '<b>$1</b>') %]
You might want to make sure that $query is a separate word, like this:
[% entry.dbid.replace("((?i:\\b$query\\b))", '<b>$1</b>') %]
Note the double backslashes: One of each pair gets "eaten" by the
double quotes, the remaining makes Perl's \b escape for a word
boundary.
--
Cheers,
haj
More information about the templates
mailing list