1

とにかく、正規表現とphpを使用するときに最初の一致をスキップすることはありますか?

または、str_replaceを使用してこれを実現する方法はありますか。

ありがとう

UPDATE ある文字列のすべてのインスタンスを別の文字列から削除しようとしていますが、最初の出現を保持したいです。

$toRemove = 'test';
$string = 'This is a test string to test to removing the word test';

出力文字列は次のようになります。

これは、単語testを削除するためにテストするテスト文字列です

4

4 に答える 4

4
preg_replace('/((?:^.*?\btest\b)?.*?)\btest\b/', '$1', $string);

アイデアは、各一致の前にあるものをすべて一致させてキャプチャしプラグインして戻すことです。これ (?:^.*?test)?により、の最初のインスタンスがtestキャプチャに含まれます。(すべてのsは、 inや。\bのような部分的な単語の一致を避けるためのものです。)testsmartesttestify

于 2010-05-17T20:56:58.453 に答える
3

簡単なPHPの方法:

<?php
    $pattern = "/an/i";
    $text = "banANA";
    preg_match($pattern, $text, $matches, PREG_OFFSET_CAPTURE);
    preg_match($pattern, $text, $matches, 0, $matches[0][1]);
    echo $matches[0];
?>

あなたに「AN」を与えます。

更新:それが置き換えであるとは知りませんでした。これを試して:

<?php
    $toRemove = 'test';
    $string = 'This is a test string to test to removing the word test';
    preg_match("/$toRemove/", $string, $matches, PREG_OFFSET_CAPTURE);
    $newString = preg_replace("/$toRemove/", "", $string);
    $newString = substr_replace($newString, $matches[0][0], $matches[0][1], 0);
    echo $newString;
?>

最初の一致を見つけてそれがどこにあったかを覚えてから、すべてを削除してから、最初の場所にあったものを元に戻します。

于 2010-05-17T15:10:45.823 に答える
0

'blah'が正規表現パターンであると仮定すると、blah(blah)は2番目のパターンと一致してキャプチャします

于 2010-05-17T15:10:35.573 に答える
0

遅い答えですが、それは人々に役立つかもしれません。

$string = "This is a test string to test something with the word test and replacing test";
$replace = "test";
$tmp = explode($replace, $string);
$tmp[0] .= $replace;
$newString = implode('', $tmp);
echo $newString; // Output: This is a test string to something with the word and replacing 
于 2015-06-25T14:43:06.423 に答える