这就是我现在所做的:
if (strpos($routeName,'/nl/') !== false) {
$routeName = preg_replace('/nl/', $lang , $routeName, 1 );
}
我用ex替换nl
。 de
。但现在我想替换second occurrence
。最简单的方法是什么?
答案 0 :(得分:8)
@Casimir的答案似乎适用于大多数情况。另一种选择是preg_replace_callback
带有计数器。如果您需要仅更换特定的第n次出现。
smoothed
这利用了本地variance
,在每次出现的回调中递增,并且只是在这里检查了固定位置。
答案 1 :(得分:3)
首先,您检查是否有任何问题,如果是,请更换它。 您可以计算出现次数( unsing substr_count ),而不知道它们中有多少存在。 然后,如果这就是你需要的,那就一点一点地替换它们。
$occurances = substr_count($routeName, '/nl/');
if ($occurances > 0) {
$routeName = preg_replace('/nl/', $lang , $routeName, 1 );
if ($occurances > 1) {
// second replace
$routeName = preg_replace('/nl/', $lang , $routeName, 1 );
}
}
如果您只想替换第二次出现(,正如您稍后在评论中所述),请查看substr并阅读PHP中的string functions。
您可以使用第一次出现,使用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;
请参见此工作here。
答案 2 :(得分:1)
你可以这样做:
$lang = 'de'
$routeName = preg_replace('~/nl/.*?(?<=/)\Knl/~', "$lang/", $routeName, 1 );
\K
将从匹配结果中删除左侧的所有内容。(因此,左侧与/nl/.*?(?<=/)
匹配的所有内容都不会被替换。) < / p>
我使用lookbehind (?<=/)
而不是文字/
来处理此特定情况/nl/nl/
(在这种情况下,.*?
匹配空子字符串。) 的