2011-01-13 32 views
5

tôi đã viết mã PHP này để thực hiện một số thay:Cách sử dụng biểu thức chính quy của preg_replace PHP để tìm và thay thế văn bản?

function cambio($txt){ 
    $from=array(
     '/\+\>([^\+\>]+)\<\+/', //finds +>text<+ 
     '/\%([^\%]+)\%/', //finds %text% 
    ); 

    $to=array(
     '<span class="P">\1</span>', 
     '<span>\1</span>', 
    ); 

    return preg_replace($from,$to,$txt); 
} 

echo cambio('The fruit I most like is: +> %apple% %banna% %orange% <+.'); 

Kết quả thành này:

The fruit I most like is: <span class="P"> <span>apple</span> <span>banna</span> <span>orange</span> </span>. 

Tuy nhiên tôi cần thiết để xác định thẻ div của trái cây, như thế này:

The fruit I most like is: <span class="P"> <span class="t1">apple</span> <span class="t2">banana</span> <span class="t3">coco</span> </span>. 

Tôi muốn mua một loại trái cây để khám phá một biểu thức chính quy để thực hiện điều này :-)


Whit sự giúp đỡ Xavier Barbosa, tôi đến sollution thức này:

function matches($matches){ 
    static $pos=0; 
    return sprintf('<span class="t%d">%s</span>',++$pos,$matches[1]); 
} 

function cambio($txt){//Markdown da Atípico : Deve ser usado depois do texto convertido para markdown 
    $from=array(
     '/\=>(.+?)<\=/', //finds: =>text<= 
     '/\+>(.+?)<\+/', //finds +>text<+ 
    ); 

    $to=array(
     '<span class="T">\1</span>', 
     '<span class="P">\1</span>', 
    ); 

    $r=preg_replace($from,$to,$txt); 
    return preg_replace_callback('/%(.*?)%/','matches',$r);//finds %text% 
    //'/%((\w)\w+)%/' //option 
} 
+0

lớp của khoảng cách bên trong (s) (tức là class = "b") luôn bằng chữ cái đầu tiên của quả? – Ass3mbler

+0

Bạn có viết ngôn ngữ khuôn mẫu của riêng bạn trong PHP không? Hãy coi chừng [BobX] (http://thedailywtf.com/Articles/We-Use-BobX.aspx). – Nathan

+0

Ass3mbler, xin lỗi, tôi không có ý định tạo mối quan hệ với chữ cái đầu tiên của nội dung. Tôi đã chỉnh sửa tên lớp thành một cái gì đó như: t1, t2 và t3. – Roger

Trả lời

2
<?php 


function cambio($txt){ 
    $from=array(
     '/\+>(.+?)<\+/', //finds +>text<+ 
     '/%((\w)\w+)%/', //finds %text% 
    ); 

    $to=array(
     '<span class="P">\1</span>', 
     '<span class="\2">\1</span>', 
    ); 

    return preg_replace($from,$to,$txt); 
} 

echo cambio('The fruit I most like is: +> %apple% %banna% %orange% <+.'); 

Và một phiên bản stateful cho PHP5.3

function cambio($txt) { 
    return preg_replace_callback('/\+>(.+?)<\+/', function ($matches) { 
     $txt = sprintf('<span class="P">%s</span>', $matches[1]); 

     return preg_replace_callback('/%(\w+)%/', function ($matches) { 
      static $pos = 0; 
      return sprintf('<span class="t%d">%s</span>', ++$pos, $matches[1]); 
     }, $txt); 

    }, $txt); 
} 

echo cambio('The fruit I most like is: +> %apple% %banna% %orange% <+.'); 
+0

Obrigado/Gracias, Xavier! Đi một chút sâu hơn, là nó có thể để có được điều này ?: Quả tôi thích nhất là: apple banna coco. – Roger

+0

Tốt cho điều này, bạn sẽ cần sử dụng hàm 'preg_replace_callback()'. Nhưng chức năng này là không trạng thái, vì vậy bạn sẽ cần phải gian lận. Xem ví dụ, nhưng hãy cẩn thận, nó chỉ hoạt động trên PHP5.3 –

+0

Hoàn hảo! Unretouchable. Cảm ơn bạn. – Roger

1

Hãy thử điều này:

function cambio($txt){ 
    $from=array(
     '/\+\>([^\+\>]+)\<\+/', //finds +>text<+ 
     '/\%(^\%)([^\%]+)\%/', //finds %text% 
    ); 

    $to=array(
     '<span class="P">\1</span>', 
     '<span class="\1">\1\2</span>', 
    ); 

    return preg_replace($from,$to,$txt); } 

echo cambio('The fruit I most like is: 
+> %apple% %banna% %orange% <+.'); 
+0

Vâng, mã số của bạn: Trái cây tôi thích nhất là: % apple%% banna%% orange% ... Lưu ý rằng tôi đã thay đổi một chút những gì tôi ước muốn đầu tiên. Tôi đang hình dung làm thế nào tôi có thể đặt tên cho lớp span bên trong với một chuỗi không liên quan đến nội dung ... – Roger

Các vấn đề liên quan