0

Ich muss Zeichen in URLs ersetzen, aber nur einen bestimmten Punkt bilden und auch doppelte Zeichen verarbeiten.Ersetze Zeichen nach einem bestimmten Zeichen/Wort, überspringe aber die erste Übereinstimmung und behandelt auch Duplikate

Die URLs wie folgt aussehen:

http://example.com/001-one-two.html#/param-what-ever 
http://example.com/002-one-two-three.html#/param-what--ever- 
http://example.com/003-one-two-four.html#/param2-what-ever- 
http://example.com/004-one-two-five.html#/param33-what--ever---here- 

und sie sollte wie folgt aussehen:

http://example.com/001-one-two.html#/param-what_ever 
http://example.com/002-one-two-three.html#/param-what_ever_ 
http://example.com/003-one-two-four.html#/param2-what_ever_ 
http://example.com/004-one-two-five.html#/param33-what_ever_here_ 

In Worten ersetzen - Zeichen (eine beliebige Anzahl davon) mit einem einzigen _ char aber überspringen das erste - nach #/
Die Saitenlänge nach der #/ variiert offensichtlich, und ich konnte keinen Weg finden, dies zu tun.

Wie kann ich das tun?

+0

Zeigen Sie uns, was Sie bisher versucht haben, . –

+0

streplace mit einem Array nach dem Finden von '# /' aber das hat nicht funktioniert. –

Antwort

0

Hier ist ein Weg, gehen preg_replace_callback mit:

$in = array(
'http://example.com/001-one-two.html#/param-what-ever', 
'http://example.com/002-one-two-three.html#/param-what--ever-', 
'http://example.com/003-one-two-four.html#/param2-what-ever-', 
'http://example.com/004-one-two-five.html#/param33-what--ever---here-' 
); 

foreach($in as $str) { 
    $res = preg_replace_callback('~^.*?#/[^-]+-(.+)$~', function ($m) { 
       return preg_replace('/-+/', '_', $m[1]); 
      }, 
      $str); 
    echo "$res\n"; 
} 

Erläuterung:

~   : regex delimiter 
^  : start of string 
    .*?  : 0 or more any character, not greedy 
    #/  : literally #/ 
    [^-]+ : 1 or more any character that is not a dash 
    -  : a dash 
    \K  : forget all we have seen until here 
    (.+) : group 1, contains avery thing after the first dash after #/ 
    $   : end of string 
~   : regex delimiter 

Ausgang:

http://example.com/001-one-two.html#/param-what_ever 
http://example.com/002-one-two-three.html#/param-what_ever_ 
http://example.com/003-one-two-four.html#/param2-what_ever_ 
http://example.com/004-one-two-five.html#/param33-what_ever_here_ 
Verwandte Themen