1. 论坛系统升级为Xenforo,欢迎大家测试!
    排除公告

问一个 PHP 的正则替换问题

本帖由 Ulysses2009-08-13 发布。版面名称:后端开发

  1. Ulysses

    Ulysses New Member

    注册:
    2006-02-05
    帖子:
    10,018
    赞:
    16
    源代码如下:

    HTML:
    <li class="classname"><a href="url" title="title">link name</a> (count)</li>
    要替换为:

    HTML:
    <li><a href="url" title="title"><span>link name</span><em>count</em></a></li>
    应该怎么写替换的表达式呢(列表有多项,所以要多次替换)?

    高手帮帮忙,谢谢!

    :haha:
     
  2. Kevin

    Kevin New Member

    注册:
    2005-10-23
    帖子:
    12,728
    赞:
    55
    只会问你技术问题的路过
     
  3. junp

    junp New Member

    注册:
    2005-11-06
    帖子:
    1,259
    赞:
    4
    PHP:
    <?php
    $string 
    '<li class="classname"><a href="url" title="title">link name</a> (count)</li>';
             
    //<li><a href="url" title="title"><span>link name</span><em>count</em></a></li>
             
    $p[0] = '/( class=".+?")/';
             
    $p[1] = '/title="(.+)">(.+?)<\/a>/';
             
    $p[2] = '/ \((.+?)\)<\/li>/';
             
    $r[0] = '';
             
    $r[1] = 'title="$1"><span>$2</span>';
             
    $r[2] = '<em>$1</em></a></li>';
    echo 
    preg_replace($p,$r,$string);
    ?>
    只针对具体。:jiong::Oh:
     
  4. xiaohaa

    xiaohaa New Member

    注册:
    2006-01-08
    帖子:
    2,302
    赞:
    11
    第一步 :去掉classname那块

    (?<=li)\s\S+(?=\>) 用空字符替换

    第二步:

    title\"\> 用title"><span>替换

    第三步:

    \<\/a\> 用</span><em>替换

    第四步:

    (?<=em\>)\W 用空字符替换

    第五步:

    \W(?=\<\/li) 用空字符替换

    第六步:

    \<\/li 用</em></a></li>.替换

    over!
     
  5. Ulysses

    Ulysses New Member

    注册:
    2006-02-05
    帖子:
    10,018
    赞:
    16
    谢谢,我试试看。
     
  6. 老林

    老林 New Member

    注册:
    2005-09-06
    帖子:
    10,580
    赞:
    36

    这样好像也可以
     
  7. Ulysses

    Ulysses New Member

    注册:
    2006-02-05
    帖子:
    10,018
    赞:
    16
    这个问题还没有解决掉,对正则表达式,太陌生了。

    现在源代码如下:


    要的结果是

     
  8. junp

    junp New Member

    注册:
    2005-11-06
    帖子:
    1,259
    赞:
    4
    先匹配出需要的内容,再拼成新的html吧。
     
  9. notnull

    notnull New Member

    注册:
    2005-09-27
    帖子:
    11,720
    赞:
    37
    我靠
    这个正则好复杂啊
    很急?
     
  10. junp

    junp New Member

    注册:
    2005-11-06
    帖子:
    1,259
    赞:
    4
    PHP:
    <?php
    $string 
    =<<< E
    <a href="cat-1.html" title="查看 分类一 下的所有文章">分类一</a> (6)<br />
    <a href="cat-2.html" title="查看 分类二 下的所有文章">分类二</a> (1)<br />
    E;
     
    //<li><a href="cat-2.html"><span>分类二</span><em>1</em</a></li>
    preg_match_all('/<a href="(.+)" title="(.+)">(.+)<\/a>\s*\((\d+)\)/',$string,$arr);
    print_r($arr);
    $len count($arr[0]);
    $liString '';
    for(
    $i 0$i $len$i++){
        
    $liString .= '<li><a href="'.$arr[1][$i].'"><span>'.$arr[3][$i].'</span><em>'.$arr[4][$i].'</em</a></li>';
    }

    echo 
    $liString;
    ?>
     
  11. Ulysses

    Ulysses New Member

    注册:
    2006-02-05
    帖子:
    10,018
    赞:
    16
    不着急,不着急。

    问题是我一点正则都不会。

    :(
     
  12. junp

    junp New Member

    注册:
    2005-11-06
    帖子:
    1,259
    赞:
    4
    试下十楼的。
     
  13. Ulysses

    Ulysses New Member

    注册:
    2006-02-05
    帖子:
    10,018
    赞:
    16
    好的,我试试看,先谢过!
     
  14. Ulysses

    Ulysses New Member

    注册:
    2006-02-05
    帖子:
    10,018
    赞:
    16
    得了!

    谢谢。

    :)
     
  15. notnull

    notnull New Member

    注册:
    2005-09-27
    帖子:
    11,720
    赞:
    37
    如果这个时候这个页面只是个静态页面,而且分类无限多
    那这个PHP这么写要累死了