如何跳过第一个正则表达式匹配?

时间:2010-05-17 14:57:28

标签: php regex string preg-replace str-replace

在使用正则表达式和php时,无论如何都要跳过第一场比赛。

或者是否有某种方法可以使用str_replace实现此目的。

由于

更新 我试图从另一个字符串中删除字符串的所有实例,但我想保留第一次出现,例如

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

输出字符串为:

这是 test 的测试字符串,用于删除单词 test

4 个答案:

答案 0 :(得分:4)

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

我们的想法是匹配并捕获每个匹配项之前的任何内容,并将其重新插入。(?:^.*?test)?会导致test第一个实例被列入捕获。 (所有\b都是为了避免部分字匹配,例如testsmartest中的testify

答案 1 :(得分: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;
?>

找到第一场比赛并记住它的位置,然后删除所有内容,然后将第一场比赛放回去。

答案 2 :(得分:0)

假设'blah'是你的正则表达式模式,blah(blah)将匹配并捕获第二个

答案 3 :(得分: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