2017-07-17 12 views
0

URL内の文字を置換する必要がありますが、特定のポイントだけを作成し、重複する文字も処理する必要があります。特定の文字/単語の後に文字を置き換えますが、最初の一致はスキップし、重複も処理します

URLは次のようになります。

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- 

、彼らは次のようになります。すなわち

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_ 

は、単一_文字で-文字(それの任意の数)を交換するが、スキップ最初-の後に​​
​​の後の文字列の長さは明らかに異なり、私はこれを行う方法を理解できませんでした。

どうすればいいですか?

ここ
+0

あなたがこれまでにしようとしているものを、私たちを表示します。 –

+0

'#/'を見つけた後で配列を持つstrreplaceが動作しませんでした。 –

答えて

0

preg_replace_callbackを使用して、移動するための方法である:

$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"; 
} 

説明:

~   : 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 

出力:

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_