Как пропустить первый матч с регулярным выражением? - PullRequest
1 голос
/ 17 мая 2010

Есть ли возможность пропустить первый матч при использовании регулярных выражений и php.

Или есть какой-то способ добиться этого с помощью str_replace.

Спасибо

UPDATE Я пытаюсь удалить все экземпляры строки из другой строки, но хочу сохранить первое вхождение, например

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

Выходная строка будет:

Это тестовая строка для test для удаления слова test

Ответы [ 4 ]

4 голосов
/ 18 мая 2010
preg_replace('/((?:^.*?\btest\b)?.*?)\btest\b/', '$1', $string);

Идея состоит в том, чтобы сопоставить и захватить все, что предшествует каждому совпадению, и снова подключить его. (?:^.*?test)? заставляет первый экземпляр test быть включенным в захват , (Все \b должны избегать совпадений с частичными словами, например test в smartest или testify.)

3 голосов
/ 17 мая 2010

Простой способ 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];
?>

даст вам «АН».

ОБНОВЛЕНИЕ : Не знал, что это замена. Попробуйте это:

<?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;
?>

Найдите первый матч и запомните, где он был, затем удалите все, затем верните все, что было на первом месте.

0 голосов
/ 25 июня 2015

Поздний ответ, но он может быть полезен людям.

$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 
0 голосов
/ 17 мая 2010

предположим, что «бла» - это ваш шаблон регулярных выражений, бла (бла) подойдет и захватит второй

...