# String highlighting problem (newbie)

**URL:** <https://www.ruby-forum.com/t/string-highlighting-problem-newbie/124514>\
**Category:** Ruby\
**Created:** [December 29, 2007, 2:47pm UTC](https://www.ruby-forum.com/t/string-highlighting-problem-newbie/124514 "2007-12-29T14:47:31Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![markthomas](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/90db22/32.png) [@markthomas](https://www.ruby-forum.com/u/markthomas)\
**Post date:** [December 29, 2007, 2:47pm UTC](https://www.ruby-forum.com/t/string-highlighting-problem-newbie/124514/1 "2007-12-29T14:47:31Z")

</div>

I have two questions:

1. I have a string  
@string = “This is a long string”.

How can I do to make two words “bold” or “italic” in this string, for  
example “is” and “long” shoudl be **?**

1. I am searching in the mysql database with this code:

@results = Product.find(:all, :conditions =\> [ “name LIKE ?”,  
“%”+@searchstring+"%"])

What if I want to search for many words in different order? I mean if I  
should searched for example: “string is a long this” in the string  
above?

Thanks,

Mark

---

<div class="post-metadata">

**Author:** ![markthomas](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/90db22/32.png) [@markthomas](https://www.ruby-forum.com/u/markthomas)\
**Post date:** [December 29, 2007, 3:21pm UTC](https://www.ruby-forum.com/t/string-highlighting-problem-newbie/124514/2 "2007-12-29T15:21:15Z")

</div>

On 29 Dec 2007, at 13:47, Mark T. wrote:

> I have two questions:
> 
> 1. I have a string  
> @string = “This is a long string”.
> 
> How can I do to make two words “bold” or “italic” in this string, for  
> example “is” and “long” shoudl be **?**

I would probably use gsub. But at the end of the day it depends on how  
the words to be bolded are determined.

> 1. I am searching in the mysql database with this code:
> 
> @results = Product.find(:all, :conditions =\> [ “name LIKE ?”,  
> “%”+@searchstring+"%"])
> 
> What if I want to search for many words in different order? I mean  
> if I  
> should searched for example: “string is a long this” in the string  
> above?

You need a full text search engine, for example the one in mysql,  
ferret, sphinx etc…

Fred

---

<div class="post-metadata">

**Author:** ![markthomas](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/90db22/32.png) [@markthomas](https://www.ruby-forum.com/u/markthomas)\
**Post date:** [December 29, 2007, 7:01pm UTC](https://www.ruby-forum.com/t/string-highlighting-problem-newbie/124514/3 "2007-12-29T19:01:05Z")

</div>

On Dec 29, 2007 6:47 AM, Mark T. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> I have two questions:
> 
> 1. I have a string  
> @string = “This is a long string”.
> 
> How can I do to make two words “bold” or “italic” in this string, for  
> example “is” and “long” shoudl be **?**

 

Brute force method?

ar = @string.split(’ ‘)  
ar[1] = “**#{ar[1]}**”  
ar[3] = “**#{ar[3]}**”  
@string = ar.join(’ ')

---

<div class="post-metadata">

**Author:** ![markthomas](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/90db22/32.png) [@markthomas](https://www.ruby-forum.com/u/markthomas)\
**Post date:** [December 29, 2007, 8:11pm UTC](https://www.ruby-forum.com/t/string-highlighting-problem-newbie/124514/4 "2007-12-29T20:11:51Z")

</div>

Thanks for your answer.

I have now used the following for the 1.:

a1 = “+”  
a2 = “_"  
 @searchstring = params[:searching].gsub(" ", "_ +”)  
@results = Product.find\_by\_sql(“SELECT \* FROM products WHERE MATCH  
(name,sku) AGAINST (’”+a1+@searchstring+a2+"’ IN BOOLEAN MODE) order by  
name desc LIMIT 0,50;")

It works, BUT not for numbers. Any idea why it coesnÂ´t work for numbers?  
If I have example: “this is 34” in the database. It works fine “this  
is”, but as soon as I enter the “34” it shows no results.

About 2:

Brute force method? - What do you mean by this?

ar = @string.split(’ ‘)  
ar[1] = “**#{ar[1]}**”  
ar[3] = “**#{ar[3]}**”  
@string = ar.join(’ ')

---

<div class="post-metadata">

**Author:** ![markthomas](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/90db22/32.png) [@markthomas](https://www.ruby-forum.com/u/markthomas)\
**Post date:** [December 29, 2007, 8:42pm UTC](https://www.ruby-forum.com/t/string-highlighting-problem-newbie/124514/5 "2007-12-29T20:42:27Z")

</div>

On Dec 29, 2007 12:11 PM, Mark T. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> Brute force method? - What do you mean by this?
> 
> ar = @string.split(’ ‘)  
> ar[1] = “**#{ar[1]}**”  
> ar[3] = “**#{ar[3]}**”  
> @string = ar.join(’ ')

By brute force, I meant simply a quick and dirty operation

1. split the string into components
2. modify the components
3. reassemble/join the components

If you have need to do this on a repetitive basis, you could develop a  
method to apply this logic, something like

def hilite(a\_str, a\_nbr, a\_tag=‘b’)  
ix = a\_nbr - 1  
ar = a\_str.split(’ ‘)  
ar[ix] = “\<#{a\_tag}\>#{ar[ix]}\</#{a\_tag}\>”  
str = ar.join(’ ')  
return str  
end  
strx = “This is a long string”  
p strx  
strx = hilite(strx,2) # make word 2 bold  
p strx  
strx = hilite(strx,4,‘i’) # make word 4 italic  
p strx

This is still pretty brute force, since the method will break badly if  
you pass it the wrong elements - no error/bounds checking. You could  
modify it to scan for a particular word to hilite instead of using a  
word number.

Enjoy,

---

<div class="post-metadata">

**Author:** ![markthomas](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/90db22/32.png) [@markthomas](https://www.ruby-forum.com/u/markthomas)\
**Post date:** [December 29, 2007, 8:15pm UTC](https://www.ruby-forum.com/t/string-highlighting-problem-newbie/124514/6 "2007-12-29T20:15:15Z")

</div>

> About 2:
> 
> Brute force method? - What do you mean by this?
> 
> ar = @string.split(’ ‘)  
> ar[1] = “**#{ar[1]}**”  
> ar[3] = “**#{ar[3]}**”  
> @string = ar.join(’ ')

Also the string can be different, like “Blabla bla is a long string”.

---

<div class="post-metadata">

**Author:** ![markthomas](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/90db22/32.png) [@markthomas](https://www.ruby-forum.com/u/markthomas)\
**Post date:** [December 29, 2007, 9:01pm UTC](https://www.ruby-forum.com/t/string-highlighting-problem-newbie/124514/7 "2007-12-29T21:01:06Z")

</div>

Thanks, but one problem. I donÂ´t now which word to replace. I mean in  
practicly I want to search for some words and then replace them with  
bold words.

---

<div class="post-metadata">

**Author:** ![markthomas](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/90db22/32.png) [@markthomas](https://www.ruby-forum.com/u/markthomas)\
**Post date:** [December 30, 2007, 1:01am UTC](https://www.ruby-forum.com/t/string-highlighting-problem-newbie/124514/8 "2007-12-30T01:01:17Z")

</div>

On 29 Dec 2007, at 19:11, Mark T. wrote:

> name desc LIMIT 0,50;")
> 
> It works, BUT not for numbers. Any idea why it coesn´t work for  
> numbers?  
> If I have example: “this is 34” in the database. It works fine “this  
> is”, but as soon as I enter the “34” it shows no results.

Does it work for longer numbers? By default mysql won’t index words  
less than 3 characters or so (check the doc) there are also stopwords  
etc…

Fred
