diff options
author | nodiscc <nodiscc@gmail.com> | 2014-12-25 01:21:39 +0100 |
---|---|---|
committer | nodiscc <nodiscc@gmail.com> | 2014-12-25 01:21:39 +0100 |
commit | 3259f1a81479ea24cc25e34529f4bafc655dbd0d (patch) | |
tree | 9167fa6411634d5673e44135648427bfdca8f8f5 | |
parent | 169512f0b8eaf5cc467ab9b4142011e60811bc67 (diff) | |
parent | 2e45fdd8ff84678215ac838133f89c57580b59af (diff) | |
download | Shaarli-3259f1a81479ea24cc25e34529f4bafc655dbd0d.tar.gz Shaarli-3259f1a81479ea24cc25e34529f4bafc655dbd0d.tar.zst Shaarli-3259f1a81479ea24cc25e34529f4bafc655dbd0d.zip |
Merge pull request #82 from pikzen/fix-search
Made tag/title search unicode aware, fixes #75
-rw-r--r-- | index.php | 18 |
1 files changed, 11 insertions, 7 deletions
@@ -794,14 +794,16 @@ class linkdb implements Iterator, Countable, ArrayAccess | |||
794 | { | 794 | { |
795 | // FIXME: explode(' ',$searchterms) and perform a AND search. | 795 | // FIXME: explode(' ',$searchterms) and perform a AND search. |
796 | // FIXME: accept double-quotes to search for a string "as is"? | 796 | // FIXME: accept double-quotes to search for a string "as is"? |
797 | // Using mb_convert_case($val, MB_CASE_LOWER, 'UTF-8') allows us to perform searches on | ||
798 | // Unicode text. See https://github.com/shaarli/Shaarli/issues/75 for examples. | ||
797 | $filtered=array(); | 799 | $filtered=array(); |
798 | $s = strtolower($searchterms); | 800 | $s = mb_convert_case($searchterms, MB_CASE_LOWER, 'UTF-8'); |
799 | foreach($this->links as $l) | 801 | foreach($this->links as $l) |
800 | { | 802 | { |
801 | $found= (strpos(strtolower($l['title']),$s)!==false) | 803 | $found= (strpos(mb_convert_case($l['title'], MB_CASE_LOWER, 'UTF-8'),$s) !== false) |
802 | || (strpos(strtolower($l['description']),$s)!==false) | 804 | || (strpos(mb_convert_case($l['description'], MB_CASE_LOWER, 'UTF-8'),$s) !== false) |
803 | || (strpos(strtolower($l['url']),$s)!==false) | 805 | || (strpos(mb_convert_case($l['url'], MB_CASE_LOWER, 'UTF-8'),$s) !== false) |
804 | || (strpos(strtolower($l['tags']),$s)!==false); | 806 | || (strpos(mb_convert_case($l['tags'], MB_CASE_LOWER, 'UTF-8'),$s) !== false); |
805 | if ($found) $filtered[$l['linkdate']] = $l; | 807 | if ($found) $filtered[$l['linkdate']] = $l; |
806 | } | 808 | } |
807 | krsort($filtered); | 809 | krsort($filtered); |
@@ -813,12 +815,14 @@ class linkdb implements Iterator, Countable, ArrayAccess | |||
813 | // e.g. print_r($mydb->filterTags('linux programming')); | 815 | // e.g. print_r($mydb->filterTags('linux programming')); |
814 | public function filterTags($tags,$casesensitive=false) | 816 | public function filterTags($tags,$casesensitive=false) |
815 | { | 817 | { |
816 | $t = str_replace(',',' ',($casesensitive?$tags:strtolower($tags))); | 818 | // Same as above, we use UTF-8 conversion to handle various graphemes (i.e. cyrillic, or greek) |
819 | // TODO: is $casesensitive ever true ? | ||
820 | $t = str_replace(',',' ',($casesensitive?$tags:mb_convert_case($tags, MB_CASE_LOWER, 'UTF-8'))); | ||
817 | $searchtags=explode(' ',$t); | 821 | $searchtags=explode(' ',$t); |
818 | $filtered=array(); | 822 | $filtered=array(); |
819 | foreach($this->links as $l) | 823 | foreach($this->links as $l) |
820 | { | 824 | { |
821 | $linktags = explode(' ',($casesensitive?$l['tags']:strtolower($l['tags']))); | 825 | $linktags = explode(' ',($casesensitive?$l['tags']:mb_convert_case($l['tags'], MB_CASE_LOWER, 'UTF-8'))); |
822 | if (count(array_intersect($linktags,$searchtags)) == count($searchtags)) | 826 | if (count(array_intersect($linktags,$searchtags)) == count($searchtags)) |
823 | $filtered[$l['linkdate']] = $l; | 827 | $filtered[$l['linkdate']] = $l; |
824 | } | 828 | } |