0

私は文字列を持っていますabcxdefxghix。最初の「x」を除くすべての「x」を削除したいと思います。を使用して最初の「x」の位置を簡単に見つけることができるので、strpos()その位置の後のすべての「x」を削除したいと考えています。 str_replace()指定された文字列を別の文字列に置換しますが、開始位置は許可しません。 substr_replace()開始位置を指定しますが、検索パラメーターはありません。これは を使用して実行できることはわかってpreg_replace()いますが、正規表現を使用せずに (またはクレイジーな分割/置換/組み立て戦略を使用せずに) 可能であるように思われます。

4

3 に答える 3

1

次のようなことができます。

list($first,$remainder) = explode($searchString,$subjectString,2);
$remainder = str_replace($searchString,$replacementString,$remainder);
$resultString = $first.$searchString.$remainder;
于 2013-10-06T14:27:21.093 に答える
0

もっと簡単な方法があるはずだと思っていましたが、明らかにそうではありません。私のホームスパン関数はうっかり高速でしたが、「昔ながらの方法」があれば、おそらくそれが進むべき道です。

function replace_all_but_first_1($search,$replace,$subject){
    $pos=strpos($subject,$search);
    return ($pos===false)?$subject:substr($subject,0,$pos+1).str_replace($search,$replace,substr($subject, $pos));        
}
function replace_all_but_first_2($search,$replace,$subject){
    $index = strpos($subject, $search);
    if ($index !== false) {
        $subject = substr($subject, 0, $index + 1).
        str_replace($search, $replace, substr($subject, $index + 1));
    }
    return $subject;       
}
function replace_all_but_first_3($search,$replace,$subject){
    list($first,$remainder) = explode($search,$subject,2);
    $remainder = str_replace($search,$replace,$remainder);
    $resultString = $first.$search.$remainder;
    return $resultString;
}

function replace_all_but_first($search,$replace,$subject){
    echo('Replace "'.$search.'" with "'.$replace.'" in "'.$subject.'"<br><br>');
    echo('replace_all_but_first_1: '.replace_all_but_first_1($search,$replace,$subject)."<br>");
    echo('replace_all_but_first_2: '.replace_all_but_first_2($search,$replace,$subject)."<br>");
    echo('replace_all_but_first_3: '.replace_all_but_first_3($search,$replace,$subject)."<br>");
    $time=microtime(true);
    for ($i = 1; $i <= 100000; $i++) {$x=replace_all_but_first_1($search,$replace,$subject);}
    echo('replace_all_but_first_1 '.(microtime(true)-$time).'<br>');
    $time=microtime(true);
    for ($i = 1; $i <= 100000; $i++) {$x=replace_all_but_first_2($search,$replace,$subject);}
    echo('replace_all_but_first_2 '.(microtime(true)-$time).'<br>');
    $time=microtime(true);
    for ($i = 1; $i <= 100000; $i++) {$x=replace_all_but_first_3($search,$replace,$subject);}
    echo('replace_all_but_first_3 '.(microtime(true)-$time).'<br>');
    echo('<br><br><br>');
}

replace_all_but_first('x','','abcxdefxghix');
replace_all_but_first('x','','xabcxdefxghix');
replace_all_but_first('z','','abcxdefxghix');


Replace "x" with "" in "abcxdefxghix"

replace_all_but_first_1: abcxdefghi
replace_all_but_first_2: abcxdefghi
replace_all_but_first_3: abcxdefghi
replace_all_but_first_1 0.18973803520203
replace_all_but_first_2 0.19031405448914
replace_all_but_first_3 0.19151902198792



Replace "x" with "" in "xabcxdefxghix"

replace_all_but_first_1: xabcdefghi
replace_all_but_first_2: xabcdefghi
replace_all_but_first_3: xabcdefghi
replace_all_but_first_1 0.18725895881653
replace_all_but_first_2 0.19358086585999
replace_all_but_first_3 0.19228482246399



Replace "z" with "" in "abcxdefxghix"

replace_all_but_first_1: abcxdefxghix
replace_all_but_first_2: abcxdefxghix
replace_all_but_first_3: abcxdefxghixz
replace_all_but_first_1 0.074465036392212
replace_all_but_first_2 0.075581073760986
replace_all_but_first_3 0.71253705024719
于 2013-10-06T15:10:39.307 に答える
0

私はおそらく昔ながらの方法でそれを行うでしょう:

$index = strpos($input, $needle);
if ($index !== false) {
    $input = substr($input, 0, $index + 1).
             str_replace($needle, $replacement, substr($input, $index + 1));
}
于 2013-10-06T14:31:27.000 に答える