有许多图片,有的有width和height,有的没有width和height。如何使用正则去除所有图片的width和height部分?我的代码无效,求助。<pre> 
<?php 
$s = '<img hspace="4" vspace="4" border="1" alt="Nagoya Institute folding X-Frame car lacks S-foils, hyperdrive, rolls on a big orange ball" src="http://www.blogcdn.com/www.engadget.com/media/2010/09/x-frame-2010-09-02-600.jpg" /> 
<img src="http://media02.hongkiat.com/speed-performance-check/pingdom.jpg" alt="Pingdom" border="0" title="18 Website Speed and Performance Checking Tools" />
<img width="200px" height="100px" src="http://blog.makezine.com/upload/2010/09/vice_grip_with_more_cowbell/expand-o.jpg"  alt="expand-o.jpg" />';
$img=preg_replace('/ width="\d+" height="\d+"/', '', $s);
echo $img;
?> 
</pre>

解决方案 »

  1.   


    <?php
    #mail: [email protected]
    $s = '<img hspace="4" vspace="4" border="1" alt="Nagoya Institute folding X-Frame car lacks S-foils, hyperdrive, rolls on a big orange ball" src="http://www.blogcdn.com/www.engadget.com/media/2010/09/x-frame-2010-09-02-600.jpg" /> 
    <img src="http://media02.hongkiat.com/speed-performance-check/pingdom.jpg" alt="Pingdom" border="0" title="18 Website Speed and Performance Checking Tools" />
    <img width="20px" src="http://media02.hongkiat.com/speed-performance-check/pingdom.jpg" alt="Pingdom" border="0" title="18 Website Speed and Performance Checking Tools" />
    <img height="30px" src="http://media02.hongkiat.com/speed-performance-check/pingdom.jpg" alt="Pingdom" border="0" title="18 Website Speed and Performance Checking Tools" />
    <img width="200px" height="100px" src="http://blog.makezine.com/upload/2010/09/vice_grip_with_more_cowbell/expand-o.jpg"  alt="expand-o.jpg" />';
    echo $s."\n\n";
    $s = preg_replace(array('/(?<=<img)([^>]*?)(width="[^>]+?")/', '/(?<=<img)([^>]*?)(height="[^>]+?")/'), array('', ''), $s);
    echo $s;
    ?>
      

  2.   

    感谢lgg201,分肯定会结给你,我结贴率很高的。
    但是再问一下,我自己看着书琢磨出以下代码'/.*?<img(.*?)src=\"(.*?)\"(.*?)>(.*?)$/i',"<img src=\"$2\">"貌似也可以达到效果,这个代码是否合理?貌似除了图片URL,其余全砍了。
    不理解$2的含义,能否分别解释一下2个代码?再次感谢。
      

  3.   

    '/.*?<img(.*?)src=\"(.*?)\"(.*?)>(.*?)$/i',"<img src=\"$2\">"
    这个正则表达式是获取img的src属性值,重新构建img标签要理解这个正则替换中的$2, 需要理解的概念是: 子组.
    子组在正则表达式中, 表现形式是().
    在正则表达式匹配中, 整个正则表达式匹配的内容是第一个子组, 其他的子组按照左括号出现的顺序排列.例如:
    /A(a(b(d)c))/, 用这个整个正则表达式匹配Aabdc得到的数组表示应该是
    array('Aabdc', 'abdc', 'bdc', 'd');
    扩展知识: 正则表达式中由子组扩展出来的概念有非捕获组, 断言匹配和条件匹配其实也应该归于非捕获组, 另外有反向引用.
    而在正则替换中, 也应用了子组的概念, 从上面的例子可以看出, 每个子组都是有编号的, 整个表达式编号为0, 其后每个子组顺次为1, 2, 3, 我记得这个编号好像最大到99, 各种语言可能有不同的限定.在有了子组这个概念之后, 我们可以在替换中满足更多的需求, 比如交换顺序, 保留一些子组等.
    如楼主给出的正则, 则是保留其中一个子组, 这里是$2, 那么你就从正则表达式从左向右数, 第二个左括号, 可以看出它是用来匹配src这个属性内容的. 那么其实很明了了:
    把整个正则的内容(一个<img>标签)替换成一个空的<img>标签, 其src属性是从被替换<img>中匹配到的.也就是说, 当你的<img>标签在有其他属性的时候, 也应该会被一并清除, 只剩src.再多说一点, 上面提到的扩展知识里的反向引用, 其实和这里$2的用法是一致的. 不过可能不是$2, 而是\2, 或者什么的, 反正是标记此处用第二个子组再次进行匹配
    比如: /^(a)\1$/就会匹配aa, 而不是一个a就能打发了.关于子组以及反向引用, 给楼主一个小代码, 观察结果, 应该可以理解, 理解子组之后, 正则替换中的$也就迎刃而解了:
    $s = 'a';
    preg_match('/a/', $s, $result);
    var_dump($result);
    preg_match('/(a)/', $s, $result);
    var_dump($result);
    preg_match('/(a)\1/', $s, $result);
    var_dump($result);
    $s = 'aa';
    preg_match('/(a)\1/', $s, $result);
    var_dump($result);
      

  4.   

    非常感谢lgg201的热心指点。结贴给分。