0

只是一个关于正则表达式的快速问题:这段代码是否适用于我需要做的任何修饰?(即可以将其输入数据库并且安全吗?)

function markdown2html($text) {
        $text = htmlspecialchars($text, ENT_QUOTES, 'UTF-8');
    // Strong Emphasis
    $text = preg_replace('/__(.+?)__/s', '<strong>$1</strong>', $text);
    $text = preg_replace('/\*\*(.+?)\*\*/s', '<strong>$1</strong>', $text);

    // Underline
    $text = preg_replace('/_([^_]+)_/', '<p style="text-decoration: underline;">$1</p>', $text);
    //Italic
    $text = preg_replace('/\*([^\*]+)\*/', '<em>$1</em>', $text);

    // Windows to Unix
    $text = str_replace('\r\n', '\n', $text);
    // Macintosh to Unix
    $text = str_replace('\r', '\n', $text);

    //Paragraphs
    $text = '<p>' . str_replace("\n\n", '</p><p>', $text) . '</p>';
    $text = str_replace("\n", '<br />', $text);

    // [Linked Text](Url)   
   $text = preg_replace('/\[([^\]]+)]\(([a-z0-9._~:\/?#@!$&\'()*+,;=%]+)\)/i', '<a href="$2">$1</a>', $text);

   return $text;

}
4

3 回答 3

1

不,绝对不是。

您的代码与 SQL 无关——它根本不修改'\字符。将此函数的格式化功能与 SQL 转义混合在一起是愚蠢的。

在某些情况下,您的代码也可能会引入 HTML 注入——我特别怀疑 URL 链接正则表达式。如果没有适当的解析器,我不会相信它。

于 2013-01-15T02:06:45.040 回答
0

不,数据通过该功能后不能保证安全。

您需要转义 sql 敏感字符或使用 PDO/Mysqli。无论如何,准备好的陈述要方便得多。

不要使用将查询组合在一起的旧方法,即:

$query = 'select * from table where col = '.$value;

你只是在那里自找麻烦。

于 2013-01-15T02:00:14.187 回答
0

我突然想到了几件事:

我相信前两个正则表达式('/__(.+?)__/s'以及对应的 for *)处理 ___word___ 和 ***word*** 不正确——它们会将第三个字符视为单词的一部分,所以你会得到*word * (第一个* 是粗体,后面的不是)而不是word

在第三个('/_([^_]+)_/')上,它真的适合

不要那样做

变成

做 <p style="text-decoration: underline;">不</p> 那样做

?

当然,我并不是说如果你解决了这些问题就可以使用。

于 2013-01-15T03:09:56.247 回答