从Word中删除不安全的HTML字符而不替换HTML标记

时间:2012-01-04 15:19:20

标签: php

从Word中复制/粘贴时,我会遇到很多不安全的字符。我没有单独查找/替换每个字符,而是认为编写一个快速的PHP脚本来执行此操作会很有用。

当我点击提交时,我想要替换的每个字符下面的示例HTML都被替换为 。我做错了什么?

我是否正确地认为如果我使用:htmlentities()htmlspecialchars()这将取代HTML标记?

示例HTML块

<p>Nam ’velit metus, vulputate – eget sodales ut, dignissim “vehicula nisi”. Lor’em ipsum dolor sit amet, consectetur adipiscing elit. Nunc pharetra luctus mi, sollicitudin ultrices lacus iaculis sed. Nam aliquam, tortor id sodales scelerisque, est mauri’s adipiscing nunc, a tincidunt tortor elit eget quam. Fusce sagittis arcu ut urna egestas luctus. Aliquam erat volutpat. Suspendisse ut turpis mi. Nulla facilisi. Ut congue porta urna nec semper. Aenean feugiat ante vitae – dui accumsan placerat. Suspendisse aliquet, libero non tempor–  dignissim, arcu nibh luctus magna, eu pellentesq’ue libero eros nec magna. Phasellus non ullamcorper nisi. Aenean sagittis elit ac lorem imperdiet ac consequat sem commodo. Aenean in elit at lectus blandit varius nec in erat. Mauris elementum, turpis eu eleifend pora, quam purus tempor justo, et feugiat tellus mi sed erat.</p>
    <ul>
        <li><strong>’Pellentesque’</strong> nec leo cursus ipsum rhoncus volutpat nec eget mi.</li>
        <li><strong>N–am</strong> quis lectus enim, ac euismod urna.</li>
        <li><strong>Donec</strong> varius massa augue, at feugiat tortor.</li>
        <li><strong>“Duis”</strong> non massa eget elit euismod pulvinar.</li>
        <li><strong>Duis</strong> bibendum sodales lorem, vel commodo metus volutpat a.</li>
        <li><strong>Nu–nc</strong> pulvinar lacus in nisl dignissim euismod.</li>
        <li><strong>“Nulla”</strong> tincidunt nulla adipiscing ante aliquet mattis</li>
    </ul>


<?php     
/**
 *
 * @param string $unformatted
 * @return string
 */
function format($unformatted) {

    $html = strtolower(trim($unformatted));

    //replace accent characters, forien languages
    $search = array('à','á','â','ã','ä','ç','è','é','ê','ë','ì','í','î','ï','ñ','ò','ó','ô','õ','ö','ù','ú','û','ü','ý','ÿ','À','Á','Â','Ã','Ä','Ç','È','É','Ê','Ë','Ì','Í','Î','Ï','Ñ','Ò','Ó','Ô','Õ','Ö','Ù','Ú','Û','Ü','Ý'); 
    $replace = array('a','a','a','a','a','c','e','e','e','e','i','i','i','i','n','o','o','o','o','o','u','u','u','u','y','y','A','A','A','A','A','C','E','E','E','E','I','I','I','I','N','O','O','O','O','O','U','U','U','U','Y'); 
    $html = str_replace($search, $replace, $html);

    //replace common characters
    $search = array('/(\s\&\s)/i', '/(\s\£\s)/i', '/(\s\$\s)/i'); 
    $replace = array('&amp;', '&pound;', '&dollar;'); 
    $html= preg_replace($search, $replace, $html);

    //replace MS office crap
    $search = array("‘", "’", "”", "“", "–", "…");
    $replace = array("'", "'", '"', '"', "-", "..."); 
    $html= str_replace($search, $replace, $html);

    return $html;
}

if(isset($_POST['clean'])){
    $html = format($_POST['html']);
} 

?>

<!doctype html>
<html>
<head>
    <meta charset="utf-8" />

    <title>HTML Tidy</title>

    <style type="text/css">
        body {
            color: #262626;
            background: #f4f4f4;
            font: normal 12px/18px Verdana, sans-serif;
            height: 100%;
        }
        #container {
            width: 760px;
            margin: 40px auto 0 auto;
            padding: 10px 60px;
            border: solid 1px #cbcbcb;
            background: #fafafa;
            -moz-box-shadow: 0px 0px 10px #cbcbcb;
            -webkit-box-shadow: 0px 0px 10px #cbcbcb;
        }
    </style>
</head>

<body>
    <div id="container" class="content">
        <h1>HTML Tidy</h1>

        <form action="" method="post">
            <textarea name="html" id="html" rows="20" cols="90"><?php if(isset($html)){ echo $html; } ?></textarea>

            <input type="submit" name="clean" value="Clean" />
        </form>
    </div>
</body>
</html>

文件属性 encoding

页面标题 headers

2 个答案:

答案 0 :(得分:1)

你正在寻找这个吗?如果UTF8编码没有问题。

setlocale(LC_ALL, 'en_US.UTF8');

echo iconv('UTF-8', 'ASCII//TRANSLIT', '“Duis”'); # "Duis"

答案 1 :(得分:1)

htmlspecialchars确实需要对不安全的字符做些什么,这些字符是< > & ' "而不是其他任何内容。

您的问题似乎是您的PHP文件未保存在您用于网页的编码中。在2012年,我们可以肯定地说你真的应该总是使用UTF-8而不是别的。 (当然,除非你使用的是UTF-16)。

然后发生的事情是一团糟,涉及PHP将一个多字节字符视为多个字符,只替换它的一部分并使其无效。但即使这样也不是不安全的。这只是丑陋而无理的。

@webarto的回答确实解决了你想要解决的问题,但这首先是错误的问题。

在您发布的屏幕截图中,您应选择其他并选择UTF-8,然后找到默认编码的设置位置并将其设置为UTF-8,并且从现在开始仅使用UTF-8。请。