$str = <<<EOF
[div style=width:expression(alert(123))]百度1[/div]
[div style=width:70px]百度2[/div]
[div style=width:expre/*ssion(alert(123))]百度3[/div]
[div style=width:expressio]百度4[/div]
[div style=width:70]百度5[/div]
EOF;echo preg_replace(
array("/\[div\s+(style|class)=((?!expression).)*?\]/i"),
array("<div \\1=\"\\2\">"),$str);要求:除了百度1与百度2不解析之外,都解析成HTML代码

解决方案 »

  1.   

    宽度不带符号就可以了吧,
    这样呢:preg_replace('/\[(div style=width\:\w+)\](百度\d+)\[(\/div)\]/','<$1>$2<$3>',$str);
      

  2.   

    你好,这个替换的目的是包含 expression 的字符串不解析,width只是举个例子
    [div style=width:dsp;color:red]百度1[/div] 比如这样的字符串由于没有包含expression字符串,所以可以解析
      

  3.   


    $str = <<<HTML
    [div style=width:expression(alert(123))]百度1[/div] 
    [div style=width:70px]百度2[/div] 
    [div style=width:expre/*ssion(alert(123))]百度3[/div] 
    [div style=width:expressio]百度4[/div] 
    [div style=width:70]百度5[/div] 
    HTML;echo preg_replace("#\[div\s+(style|class)=([^\]]*:(?!expression|(?:.*)\/\*).+)\](.*)\[/div\]#im","<div $1='$2'>$3</div>",$str);试试
      

  4.   

    你好,这种单独测试符合我的要求,不过我放到程序中却不可以了
    就是修改discuz的ubb代码程序,不知道这位兄台是否做过另外请教一下为什么要使用#号,求解?
      

  5.   

    echo preg_replace(
    array("/\[div\s+(style|class)=((?!expression).)*?\]/i"),
    array("<div \\1=\"\\2\">"),$str);我想通过这种格式的修改!可以吗?请帮忙修改下,谢谢!!
      

  6.   

    恩,还是换了种方法了
    "/\s+(style|class)=(.*?)(expression|\*)(.*?)/i"直接替换掉带有expression和*的,CSS里面不能出现这两个东西我觉得就安全了!