我在我的数据库中存储了一些html,例如:
ID | Data
1 | <a href=\"link\" class=\"someclass\" id=\"id_10923074\"><h3 class=\"class1 class2\"><\/h3><br \/><div class=\"clearfix\"><\/div><\/a>
2 | <a href=\"lin2\" class=\"someclass\" id=\"id_10923075\"><h3 class=\"class1 class2\">some text<\/h3><br \/><div class=\"clearfix\"><\/div><\/a>
现在,我想查询h3中不包含文本的无效记录,即第1行。
我尝试了很多查询,其中一些是下面的问题:
SELECT `mytable`.* FROM `mytable` WHERE (Data LIKE '%<h3 class=\"class1 class2\"><\/h3>%')
SELECT `mytable`.* FROM `mytable` WHERE (Data LIKE '%h3 class="class1 class2"></h3%')
SELECT `mytable`.* FROM `mytable` WHERE (Data LIKE '"%class1 class2%"')
SELECT `mytable`.* FROM `mytable` WHERE (Data LIKE '%<h3 class=\"class1 class2\">%')
我在这里缺少什么?我在这里检查了很多问题,但找不到任何解决方案。
谢谢。
答案 0 :(得分:1)
您的代码按预期工作。见this sqlfiddle:
SELECT * FROM `mytable` WHERE (Data LIKE '%<h3 class=\"class1 class2\"><\/h3>%')
您的问题很可能在于您的报价。确保在PHP代码中正确转义反斜杠(\
)和引号("
)。
答案 1 :(得分:1)
找到解决方案here:
所以诀窍是双重逃避只有反斜杠,因为字符串转义只需要一次转义。
例如
The single quote ' only needs escaping once LIKE '%\'%'
But to query backslash \ you need to double escape to LIKE '%\\\\%'
If you wanted to query backslash+singlequote \' then LIKE '%\\\\\'%' (with 5 backslashes)
解释来源摘录:
因为MySQL在字符串中使用C转义语法(例如,“\ n”到 代表一个换行符),你必须加倍你使用的任何“\” 在LIKE字符串中。例如,要搜索“\ n”,请将其指定为“\ n”。 要搜索“\”,请将其指定为“\”;这是因为反斜杠 解析器剥离一次,模式匹配时再次剥离 制作,留下一个反斜杠来匹配。
正确查询:
SELECT * FROM `mytable` WHERE (Data LIKE '%<h3 class=\\\\"class1 class2\\\\"><\\\\/h3>%')
答案 2 :(得分:0)
要查找Data
至少有一个<h3>
(包含或不包含任何属性,例如class=
)且</h3>
之前没有文字的行:
WHERE Data REGEXP '<h3[^>]*></h3>'