2012-01-09 28 views
0

再次注册ex。MySQL中的正则表达式Like值

试图运行一个像SQL查询:

mysql_query("SELECT * From tablename WHERE somthing LIKE '%id|length:3:\"{$id}\"%'"); 

问题是所述长度值将是未知的,只有ID。

当然,我可以使用strlen($ ID),并做到这一点:

$len = intval(strlen($id)); 
mysql_query("SELECT * From tablename WHERE somthing LIKE '%id|length:{$len}:\"{$id}\"%'"); 

但我真的不关心检查LEN值,有一定有位注册前,以匹配任何东西,其中长度将会被排序,而不必计算长度。

mysql_query("SELECT * From tablename WHERE somthing LIKE '%id|length:^*:\"{$id}\"%'"); 

想法?

回答

1

@ Naddiseo的链接是一个很好的链接,我建议你使用REGEXP。 '没有确切的例子匹配'是什么意思?

尝试类似的信息(我在换行的可读性加):

mysql_query("SELECT * From tablename 
      WHERE somthing 
      REGEXP '^.*id\\\|length:[0-9]+:\"{$id}\".*$'"); 

无需担心转义为MySQL/PHP的字符串相关的正则表达式是

^.*id\|length:[0-9]+:"abc".*$ 

(假设abc是一个特别的$ {ID})。

它说,“找什么其次文字id|length:(我已经逃脱它作为|在正则表达式的特殊含义,你想要的文字|),其次是数字([0-9]+)是长度该ID,然后:"{$id}"和其他任何(其中{$id}已取代的)。

现在,如果你读了@Naddiseo援引MySQL regexp page,你会看到,任何反斜杠需要进一步转义为MySQL的解析反斜杠作为特殊字符。

所以,如果你要进入这个查询到MySQL命令行(假设{$id}abc现在),你必须键入:

SELECT * From tablename 
    WHERE somthing 
    REGEXP '^.*id\\|length:[0-9]+:"abc".*$' 

现在,因为你是从PHP调用这个里面双引号,你需要跳过你的反斜杠再次,以确保正确的数字通过MySQL,以及反斜杠你的双引号来逃避它们。因此在mysql_query之前的三个反斜杠在|之前。