这是我现在所做的:
if (strpos($routeName,'/nl/') !== false) {
$routeName = preg_replace('/nl/', $lang , $routeName, 1 );
}
我将nl
替换为例如de
。但现在我想要替换第二次出现
。最简单的方法是什么?
这是我现在所做的:
if (strpos($routeName,'/nl/') !== false) {
$routeName = preg_replace('/nl/', $lang , $routeName, 1 );
}
我将nl
替换为例如de
。但现在我想要替换第二次出现
。最简单的方法是什么?
@Casimir提供的答案似乎适用于大多数情况。另一种选择是使用preg_replace_callback
和计数器。如果您只需要替换特定的第n个出现。
#-- regex-replace an occurence by count
$s = "…abc…abc…abc…";
$counter = 1;
$s = preg_replace_callback("/abc/", function ($m) use (&$counter) {
#-- replacement for 2nd occurence of "abc"
if ($counter++ == 2) {
return "def";
}
#-- else leave current match
return $m[0];
}, $s);
这里利用了一个本地的$counter
,在回调函数中每次出现时递增,并在此处仅检查固定位置。
$occurrences = substr_count($routeName, '/nl/');
if ($occurrences > 0) {
$routeName = preg_replace('/nl/', $lang , $routeName, 1 );
if ($occurrences > 1) {
// second replace
$routeName = preg_replace('/nl/', $lang , $routeName, 1 );
}
}
strpos
找到第一次出现的位置,以此为起点使用 substr 进行替换。<?php
$routeName = 'http://example.nl/language/nl/peter-list/foo/bar?example=y23&source=nl';
$lang = 'de';
$routeNamePart1 = substr( $routeName, 0 , strpos($routeName,'nl') +4 );
$routeNamePart2 = substr( $routeName, strpos($routeName,'nl') + 4);
$routeNamePart2 = preg_replace('/nl/', $lang , $routeNamePart2, 1 );
$routeName = $routeNamePart1 . $routeNamePart2;
echo $routeName;
在这里查看工作中的链接。
$lang = 'de'
$routeName = preg_replace('~/nl/.*?(?<=/)\Knl/~', "$lang/", $routeName, 1 );
\K
会将匹配结果左边的所有内容删除。(因此,与/nl/.*?(?<=/)
匹配的左侧所有内容都不会被替换。)
在处理特定情况/nl/nl/
时,我使用了回顾后发断言(?<=/)
而不是字面上的/
。(在这种情况下,.*?
匹配一个空子字符串。)
/nl/
为$lang
。如果您想要替换第二个出现的内容,为什么不只是重复您的代码呢?也许可以阅读一下手册:http://www.php.net/manual/en/function.preg-replace.php - Andresch Serj