使用数据库MySQL中的LIKE运算符搜索HTML

时间:2018-01-25 15:46:43

标签: php mysql database mariadb

我在我的数据库中存储了一些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\">%')

我在这里缺少什么?我在这里检查了很多问题,但找不到任何解决方案。

谢谢。

3 个答案:

答案 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>'