0

作为标题,如果我在表格中插入一些 html。如何使用mysql提取html标签之间的明文?
例如:

CREATE TABLE `test`
(
  `id`    INT PRIMARY KEY,
  `plain` LONGTEXT
)
INSERT INTO `text` VALUES (1, '<p>text between tag 'p'</p><span>text between 'span'</span>');

在插入之前,我想使用触发器来提取我想要的纯文本。如何?
还是使用 php ?我的意思是将 html 传递给 php 脚本,然后 php 脚本进行提取。

更新

然而,使用 php 可以解决我的问题,那么 mysql 呢?

4

5 回答 5

1

如果您的内容总是以标签(等)开头

尝试这个:

SELECT * from table  WHERE colmn_name REGEXP  '>[^<]*mytext'; 

另一种方法是使用strip_tags— 从字符串中去除 HTML 和 PHP 标记

<?php
$text = '<p>Test paragraph.</p><!-- Comment --> <a href="#fragment">Other text</a>';
echo strip_tags($text);
echo "\n";

// Allow <p> and <a>
echo strip_tags($text, '<p><a>');
?>

上述代码的输出:

Test paragraph. Other text
<p>Test paragraph.</p> <a href="#fragment">Other text</a>

警告:: Because strip_tags() does not actually validate the HTML, partial or broken tags can result in the removal of more text/data than expected.

你应该把html代码放在一个变量中,比如说$html_input

$html_input= "'<p>text between tag 'p'</p><span>text between 'span'</span>'";
$stripped_html = strip_tags($html_input);

// Now insert it into the table `text`
INSERT INTO `text` VALUES (1, $striped_html);

纯粹MYSQL的方式:

CREATE FUNCTION `strip_tags`($str text) RETURNS text
BEGIN
    DECLARE $start, $end INT DEFAULT 1;
LOOP
    SET $start = LOCATE("<", $str, $start);
    IF (!$start) THEN RETURN $str; END IF;
    SET $end = LOCATE(">", $str, $start);
    IF (!$end) THEN SET $end = $start; END IF;
    SET $str = INSERT($str, $start, $end - $start + 1, "");
END LOOP;
END;

mysql> select strip_tags('<span>hel<b>lo <a href="world">wo<>rld</a> <<x>again<.');
+----------------------------------------------------------------------+
| strip_tags('<span>hel<b>lo <a href="world">wo<>rld</a> <<x>again<.') |
+----------------------------------------------------------------------+
| hello world again.                                                   |
+----------------------------------------------------------------------+
1 row in set

参考:堆栈溢出

于 2013-08-04T07:47:38.033 回答
0

在字符串上使用strip_tags()函数,将结果存储在变量中,然后在查询中使用它:

$str = "'<p>text between tag 'p'</p><span>text between 'span'</span>'";
$str = strip_tags($str); //'text between tag 'p'text between 'span''
$str = mysql_real_escape_string($str); //just for safety

在您的查询中:

INSERT INTO `text` VALUES (1, $str);

文档:strip_tags(),mysql_real_escape_string()

希望这可以帮助!

于 2013-08-04T05:55:20.583 回答
0

您也可以在 MySQL 本身中执行此操作。你需要一个等价的striptags php Funktion。看看这里

http://www.sitepoint.com/forums/showthread.php?656167-PHP-s-strip_tags()-equivalent-MYSQL-function

于 2013-08-04T06:51:33.230 回答
0

更新上述答案之一的一些修改。

DELIMITER ***
                                CREATE FUNCTION ConvertHTMLToText(str LONGTEXT CHARSET utf8)
                                RETURNS LONGTEXT CHARSET utf8
                                BEGIN
                                DECLARE start, end INT DEFAULT 1;
                                    LOOP
                                    SET start = LOCATE("<", str, start);
                                    IF (!start) THEN RETURN str; END IF;
                                    SET end = LOCATE(">", str, start);
                                    IF (!end) THEN SET end = start; END IF;
                                    SET str = TRIM(INSERT(str, start, end - start + 1, ""));
                                END LOOP;
                            END ***
于 2015-09-07T12:46:20.120 回答
0

所以我不喜欢任何现有的解决方案,我推出了自己的解决方案,速度超快,也删除了 HTML 实体,并且可以在 MySQL 服务器本身上运行。

我用 C 语言将其编写为 MySQL UDF,因此它可以尽可能高效。我说“我已经写了”,但它基本上只是一堆已经存在的东西,包括 PHPstriptagstrim直接来自 PHP 源代码的函数,然后是来自这里的 HTML 实体解码函数How to decode HTML Entities in C? .

我没有移植 PHPhtmlspecialchars_decode函数的原因很简单,这对于我需要的东西来说太复杂了,有很多额外的代码来处理诸如 Big5(中文)字符编码之类的事情。如果您需要它像 PHP 一样健壮htmlspecialchars_decode,那么您可能需要自己移植它,但到目前为止,我的unhtmlMySQL 扩展已证明对我的用例非常强大。

你可以在这里下载它,安装说明是要点的一部分。

//make sure libmysqlclient-dev is installed:
apt-get install libmysqlclient-dev

// Replace "/usr/lib/mysql/plugin" with your MySQL plugins directory (can be found by running "select @@plugin_dir;")
gcc -I/usr/include/mysql -o unhtml.so -shared unhtml.c -fPIC && cp unhtml.so /usr/lib/mysql/plugin/unhtml.so

//Then, on the server:
//create function`unhtml`returns string soname'unhtml.so';

//And use/test like:
select `unhtml`('<b>I&apos;ll say, it works!</b>');

https://gist.github.com/BrianLeishman/da6edb36ea2989b2ded533087e9d1511

于 2018-02-04T16:47:22.913 回答