Как пропустить первое совпадение с регулярным выражением?

Есть ли способ пропустить первое совпадение при использовании regex и php.

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

Спасибо

ОБНОВЛЕНИЕ Я пытаюсь удалить все экземпляры строки из другой строки, но хочу сохранить первое вхождение, например

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

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

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


person scott    schedule 17.05.2010    source источник
comment
Вставьте свое регулярное выражение и пример даты, которую вы используете.   -  person Piotr Pankowski    schedule 17.05.2010
comment
Вы хотите сопоставить только второе вхождение или все вхождения после первого?   -  person webbiedave    schedule 17.05.2010
comment
Регулярное выражение: \\[n@.*?\\] @webbiedave — я хочу сопоставить все вхождения, кроме первого.   -  person scott    schedule 17.05.2010
comment
Является ли это частью preg_replace()?   -  person Annika Backstrom    schedule 17.05.2010
comment
Да, это часть preg_replace   -  person scott    schedule 17.05.2010


Ответы (4)


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

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

person Amadan    schedule 17.05.2010
comment
Эх, придумал способ поумнее. ‹?php $toRemove = 'тест'; $string = 'Это тестовая строка для проверки удаления слова test'; $Найдено = 0; echo preg_replace(/($toRemove)/e, '$found++ ? \'\' : \'$1\'', $string); ?› - person Amadan; 18.05.2010
comment
для более умного способа, найдено всегда 1 для меня, независимо от того, сколько совпадений есть, так что это не работает - person chiliNUT; 01.02.2016

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

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

person Alan Moore    schedule 17.05.2010
comment
Я просто тебя люблю. twitter.com/tomasdev/status/640273963688574977 — это лучший способ преобразовать повторяющийся запрос параметры в одиночные, разделенные запятыми. - person Tom Roggero; 06.09.2015

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

person Charles Ma    schedule 17.05.2010

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

$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 
person Peter    schedule 25.06.2015