diff --git a/include/class.search.php b/include/class.search.php index 0df7e086e0a38fa5c85fa92c27da58b823a7ea24..fd8c7e2cff06868b63439c980252d4b4719a71a0 100644 --- a/include/class.search.php +++ b/include/class.search.php @@ -257,12 +257,34 @@ class MysqlSearchBackend extends SearchBackend { return db_query($sql); } + // Quote things like email addresses + function quote($query) { + $parts = array(); + if (!preg_match_all('`([^\s"\']+)|"[^"]*"|\'[^\']*\'`', $query, $parts, + PREG_SET_ORDER)) + return $query; + + $results = array(); + foreach ($parts as $m) { + // Check for quoting + if ($m[1] // Already quoted? + && preg_match('`@`u', $m[0]) + ) { + $char = strpos($m[1], '"') ? "'" : '"'; + $m[0] = $char . $m[0] . $char; + } + $results[] = $m[0]; + } + return implode(' ', $results); + } + function find($query, $criteria=array(), $model=false, $sort=array()) { global $thisstaff; $mode = ' IN BOOLEAN MODE'; #if (count(explode(' ', $query)) == 1) # $mode = ' WITH QUERY EXPANSION'; + $query = $this->quote($query); $search = 'MATCH (search.title, search.content) AGAINST (' .db_input($query) .$mode.')';