1

重複の可能性:
PregReplace-一致の2回目の発生を置き換えます

単語を2回含む文字列がありますrules。2番目の単語を見つけて置き換える必要があります。だましてみましstr_replace()たが、何も得られませんでした。4番目のパラメーターは私が期待したものではありませんでした。

文字列の例を次に示します。

http://localhost/proj1/modstart/admin/index.php?i=rules&sid=397ab1f6b8eb8a17787438a7e2e60ea3&mode=rules

交換後は次のようになります。

http://localhost/proj1/modstart/admin/index.php?i=rules&sid=397ab1f6b8eb8a17787438a7e2e60ea3&mode=manage

私はそれが役立つかもしれないと読みましたpreg_replace()、しかし私はパターンを書く方法を知りません。

アイデア?

PS:文字列を2つの変数に分割することはお勧めしません。それでは、私のニーズには応えられません。

4

3 に答える 3

0

正規表現について学ぶことは非常に良い考えです。PHPでは、次のように検索/置換を実行できます。

$result = preg_replace('/(rules.*?)rules/','$1manage',$str,1);

基本的に、「ルール」を1回検索し、次に何かを検索してから、2回目のルールを検索し、2回目の一致の前にすべてを元に戻し、単語を置き換えます。

于 2012-10-06T20:31:34.500 に答える
0

正規表現を使用せず、2番目の変数に何も格納しないようにするには、次str_replace()の小さな魔法を使って使用できstrpos()ます。

$string = substr($string, 0, strpos($str, 'rules') + 5) . str_replace('rules', 'whatever', substr($string, strpos($string, 'rules') + 5));

これにより、の最初のインスタンスの最後まで完全な文字列が取得され、rules次に、単語の他のインスタンスを含む文字列の2番目の部分で文字列置換が実行されます。

同じことですが、もう少しクリーンです(はい、2番目の変数を使用することで):

$pos = strpos($string, 'rules') + 5;
$string = substr($string, 0, $pos) . str_replace('rules', 'whatever', substr($string, $pos));

検索+置換する単語が動的である場合、または別のページで別の単語を使用する場合は、次のように変数を作成できます

$findMe = 'rules';
$replaceWith = 'whatever';
$pos = strpos($string, $findMe) + strlen($findMe);
$string = substr($string, 0, $pos) . str_replace($findMe, $replaceWith, substr($string, $pos));
于 2012-10-06T20:29:00.513 に答える
0

正規表現を使用する必要があります>>

$new = preg_replace('/\brules\b(?!.*\brules\b)/', 'manage', $old); 

単語の境界を使用することをお勧めします。これにより、 「preudorules」などの「rules」\bを含むいくつかの大きな文字列とは一致しなくなります。

ネガティブルックアヘッドは、背後に「ルール」(?!.*\brules\b)という言葉が他にないことを保証するため、置き換えるものが最後のものになります。

于 2012-10-07T00:25:29.523 に答える