$string = '<span style="font-size: 11.5pt; color: #444444; line-height: 160%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">白</span>
<span lang="EN-US" style="font-size: 11.5pt; color: #444444; line-height: 160%; font-family: "Arial","sans-serif"">黑</span>';$string = preg_replace("/<span (mso|lang)\>(.*?)<\/span>/is","\\2",$string);//这个匹配不到
想要匹配 只要字符串的<span>里包含有mso或lang的就清除,仅保留内容。谢谢

解决方案 »

  1.   

    $string = '<span style="font-size: 11.5pt; color: #444444; line-height: 160%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">白</span>
    <span lang="EN-US" style="font-size: 11.5pt; color: #444444; line-height: 160%; font-family: "Arial","sans-serif"">黑</span><span>哈哈</span>';//$string = preg_replace("/<span (mso|lang)\>(.*?)<\/span>/is","\\2",$string);//这个匹配不到
    $string = preg_replace("/<span [^>]*(mso|lang)[^>]*>([^(<\/)]*)<\/span>/is","\\2",$string);
    echo $string;
      

  2.   

    谢谢 cmyspl你这个能匹配到,但是不能处理嵌套标签,如下,不知可有解决方法
    <span lang="EN-US" class="Apple-style-span" style="font-family: 宋体; line-height: 18px; ">
    <span lang="EN-US">最大大赢好来之<span lang="EN-US">-2009</span></span>
    </span>
      

  3.   

    <xmp>
    <?php
    $string = '<span lang="EN-US" class="Apple-style-span" style="font-family: 宋体; line-height: 18px; ">
    <span lang="EN-US">最大大<span style="color:#000;font-size:12px;font-weight:bold;"><div align="center">11</div></span>赢好来之<span lang="EN-US">-2009</span></span>
    </span>'; 
    $stringold = '';
    $stringnew = $string;
    while($stringnew!=$stringold){
    $stringold = $stringnew;
    $stringnew = preg_replace("/<(span) [^>]*(mso|lang)[^>]*>(.*(?=<\/\\1>))<\/\\1>/is","\\3",$stringold);
    }
    echo $stringnew;
    ?>
    </xmp>
      

  4.   

    谢谢楼上的,使用while的话不如再重复一条规则有效率吧
      

  5.   

    $str = '<span lang="EN-US">最大大赢好来之<span lang="EN-US">-2009</span></span>'; function reStr($a) {
    global $pattern;
    if(is_string($a)) {
    preg_replace_callback($pattern, "reStr", $a);
    exit;
    }
    $str = $a[1].$a[3].$a[4];
    if(preg_match($pattern, $str)) {
    preg_replace_callback($pattern, "reStr", $str);
    } else {
    echo $str;
    }
    return $str;
    }

    $pattern = "/(.*?)<span[^<]*(lang|mso)[^>]*>([^<]*)<\/span>(.*)/";
    reStr($str);