在php中将php变量'foobar'与'Foo Bar'相匹配

时间:2012-06-27 12:57:11

标签: php mysql regex

我的mysql表包含一个条目

Foo Bar 

(即可能包括大写字母和空格)

我需要使用字符串'foobar'搜索数据库并匹配此

foobar最初是使用以下方式从DB生成的:

$i = str_replace(' ','',$i);
$i = preg_replace("/[^A-Za-z0-9]/", "", $i);
$i = strtolower($i);

3 个答案:

答案 0 :(得分:2)

在执行比较之前,在MySQL中将Foo Bar转换为foobar并不容易(尽管it is possible with UDFs)。那你只需要做:

WHERE LOWER(preg_replace('/[^A-Za-z0-9]/', '', field)) = 'foobar'

最简单的选择是使用regular expression pattern matching,默认情况下不区分大小写 - 只需在[^[:alnum:]]*(PHP内)的每个字符之间插入foobar,然后搜索数据库:

WHERE field RLIKE '^[^[:alnum:]]*f[^[:alnum:]]*o[^[:alnum:]]*o[^[:alnum:]]*b[^[:alnum:]]*a[^[:alnum:]]*r[^[:alnum:]]*$'

我认为最优雅(虽然有些难度)的解决方案是define your own collation忽略非字母数字字符和字母,然后使用它。

答案 1 :(得分:1)

MySQL没有与gawk的gensub()或PHP的preg_replace()等价的东西。虽然您可以使用MySQL的REPLACE()LOWER()函数来删除特定字符,但您无法告诉MySQL删除/[^[:alnum:]]/

我的建议是使用UDF

答案 2 :(得分:1)

如果只有空格是问题,并且您的排序规则不区分大小写:

WHERE REPLACE(tn.fieldname,' ','') LIKE 'foobar';

如果您的排序规则区分大小写:

WHERE LOWER(REPLACE(tn.fieldname,' ','')) LIKE LOWER('foobar');

然而,它会导致全表扫描,因此性能不佳。将fieldname规范化为您要搜索的内容,或将规范化fieldname的其他列规范化,效果会更好,特别是对其进行索引。