php中DOMDocument对于xml操作我们只要是英文是没有问题了,但如果是中文字体就会有乱码问题了,下面我们就此问题给各位介绍一些解决办法吧.

PHP的DOM内部是utf8机制的,在loadHTML时,是通过检查字符中meta的charset来设置编码的,如果没有charset,就当iso8859进行处理了,而这种情况下进行saveXML时,输出来的却是utf8,所以就看到乱码了.

这么说是不是还不太理解,举个例子:

$xml = new DOMDocument();
@$xml->loadHTML('<div>我就是测试看看</div>');   
$dom = new DOMXPath($xml);
echo $dom->query('//div')->item(0)->saveXML();

打开网页执行,你会发现输出乱码了,那如何解决这个问题呢?有两种方式.

第一种:在loadHTML的时候指定编码,下面这段代码引用自php.net官方文档中的回复,代码如下:

$doc = new DOMDocument();
$doc->loadHTML('<?xml encoding="UTF-8">' . $html);
foreach ($doc->childNodes as $item)
{
    if ($item->nodeType == XML_PI_NODE)
    {
        $doc->removeChild($item); // remove hack
    }
}
$doc->encoding = 'UTF-8'; // insert proper

第二种方法:通过iconv对输出的字符重新转换,代码如下:

echo iconv("UTF-8", "GB18030//TRANSLIT", $dom->saveXML($n) );

主要集中在 upload/includes/cls_template.php 文件中:

1:line 300 :

原语句:

return preg_replace("/{([^\}\{\n]*)}/e", "\$this->select('\\1');", $source);

修改为:

return preg_replace_callback("/{([^\}\{\n]*)}/", function($r) { return $this->select($r[1]); }, $source);

2:line 495:

原语句:

$out = "<?php \n" . '$k = ' . preg_replace("/(\'\\$[^,]+)/e" , "stripslashes(trim('\\1','\''));", var_export($t, true)) . ";\n";

修改为:

$replacement = preg_replace_callback("/(\'\\$[^,]+)/" ,

function($matcher){

return stripslashes(trim($matcher[1],'\''));

},

var_export($t, true));

$out = "<?php \n" . '$k = ' . $replacement . ";\n";

3:line 554: //zuimoban.com 转载不带网址,木JJ

原语句:

$val = preg_replace("/\[([^\[\]]*)\]/eis", "'.'.str_replace('$','\$','\\1')", $val);

修改为:

$val = preg_replace_callback("/\[([^\[\]]*)\]/is",

function ($matcher) {

return '.'.str_replace('$','\$',$matcher[1]);

},

$val);

4:line 1071:

原语句:

$replacement = "'{include file='.strtolower('\\1'). '}'";

$source = preg_replace($pattern, $replacement, $source);

修改为:

$source = preg_replace_callback($pattern,

function ($matcher) {

return '{include file=' . strtolower($matcher[1]). '}';

},

$source);


Bittwiste的官方开源地址:bittwist.sourceforge.net。软件提供了三个版本,分别针对FreeBSD、Linux、Windows系统。需要在什么平台编译,下载相关的源码包即可.

示例:

将目的ip从192.168.1.3修改为10.10.10.10

# bittwiste -I in.pcap -O out.pcap -T ip -d 192.168.1.3,10.10.10.10


网络时间协议(英语:Network Time Protocol,NTP)是以数据包交换把两台电脑的时钟同步化的网络传输协议。NTP使用UDP端口123作为传输层。它是用作抵销可变延迟的影响。

放大反射 Dos 攻击由 CVE-2013-5211 所致。且这漏洞是与 molist 功能有关。ntpd 4.2.7p26 之前的版本都会去响应 NTP 中的 mode7 monlist 请求。ntpd-4.2.7p26 版本后, monlist 特性已经被禁止,取而代之的是 mrulist 特性,使用 mode6 控制报文,并且实现了握手过程来阻止对第三方主机的放大攻击。

因为 Ubuntu 14.04 默认的 ntpd 版本是 4.2.6p5 ,所以我们可以用禁止 monitor 的方法,直接修改 /etc/ntp.conf 即可

echo "disable monitor" >> /etc/ntp.conf

然后重启 ntp 服务

service ntp restart

验证下是否生效:

root@example:~# ntpdc

ntpdc> monlist

***Server reports data not found


map映射到结构体,这里只支持简单的数据类型,复杂的需要在拓展

package main
import (
    "errors"
    "fmt"
    "reflect"
    "strconv"
    "time"
)
type User struct {
    Name string
    Age  int8
    Date time.Time
}
func main() {
    data := make(map[string]interface{})
    data["Name"] = "张三"
    data["Age"] = 26
    data["Date"] = "2015-09-29 00:00:00"
    result := &User{}
    err := FillStruct(data, result)
    fmt.Println(err, fmt.Sprintf("%+v", *result))
}
//用map填充结构
func FillStruct(data map[string]interface{}, obj interface{}) error {
    for k, v := range data {
        err := SetField(obj, k, v)
        if err != nil {
            return err
        }
    }
    return nil
}
//用map的值替换结构的值
func SetField(obj interface{}, name string, value interface{}) error {
    structValue := reflect.ValueOf(obj).Elem()        //结构体属性值
    structFieldValue := structValue.FieldByName(name) //结构体单个属性值
    if !structFieldValue.IsValid() {
        return fmt.Errorf("No such field: %s in obj", name)
    }
    if !structFieldValue.CanSet() {
        return fmt.Errorf("Cannot set %s field value", name)
    }
    structFieldType := structFieldValue.Type() //结构体的类型
    val := reflect.ValueOf(value)              //map值的反射值
    var err error
    if structFieldType != val.Type() {
        val, err = TypeConversion(fmt.Sprintf("%v", value), structFieldValue.Type().Name()) //类型转换
        if err != nil {
            return err
        }
    }
    structFieldValue.Set(val)
    return nil
}
//类型转换
func TypeConversion(value string, ntype string) (reflect.Value, error) {
    if ntype == "string" {
        return reflect.ValueOf(value), nil
    } else if ntype == "time.Time" {
        t, err := time.ParseInLocation("2006-01-02 15:04:05", value, time.Local)
        return reflect.ValueOf(t), err
    } else if ntype == "Time" {
        t, err := time.ParseInLocation("2006-01-02 15:04:05", value, time.Local)
        return reflect.ValueOf(t), err
    } else if ntype == "int" {
        i, err := strconv.Atoi(value)
        return reflect.ValueOf(i), err
    } else if ntype == "int8" {
        i, err := strconv.ParseInt(value, 10, 64)
        return reflect.ValueOf(int8(i)), err
    } else if ntype == "int32" {
        i, err := strconv.ParseInt(value, 10, 64)
        return reflect.ValueOf(int64(i)), err
    } else if ntype == "int64" {
        i, err := strconv.ParseInt(value, 10, 64)
        return reflect.ValueOf(i), err
    } else if ntype == "float32" {
        i, err := strconv.ParseFloat(value, 64)
        return reflect.ValueOf(float32(i)), err
    } else if ntype == "float64" {
        i, err := strconv.ParseFloat(value, 64)
        return reflect.ValueOf(i), err
    }
    //else if .......增加其他一些类型的转换
    return reflect.ValueOf(value), errors.New("未知的类型:" + ntype)
}