-2

我需要使用正则表达式进行查找/替换。

我有以下场景:

URL 1: /test-category1/test-category-2/
URL 2: /test-category1/test-category-2/test-category3/

只有在最后一个 / 后面没有任何内容时,我如何才能用某些东西替换第一个 URL?即只替换URL1 而不是URL2?

4

4 回答 4

4

这得到了-1'ed:

if ($url[(strlen($url) - 1)] == '/') {
    $url = $replacement;
}

另一个尝试:

if (strlen(str_replace('/test-category1/test-category-2/', '', $url) == 0)) {
    $url = $replacement;
}

更新:

我声称拥有最好和最快的解决方案:

if ($url == '/test-category1/test-category-2/') {
    $url = $replacement;
}
于 2013-06-26T15:22:24.807 回答
2

需要明确的是,您要求在确切的 URL 上进行正则表达式替换:仅此/test-category1/test-category-2/而已。鉴于这些要求,这就是您想要的:

preg_replace('#^/test-category1/test-category-2/$#', $replacement, $url);

只有当它后面不包含任何内容时,这才会替换确切的字符串。匹配行$尾。

于 2013-06-26T15:12:40.867 回答
0

怎么样:

preg_replace('~^/[^/]+/[^/]+/$~', '/repl/ace/')

但是如果你真的想用这里不需要的正则表达式完全/test-category1/test-category-2/替换/test-category-2/

if ($url == '/test-category1/test-category-2/')
    $url = '/test-category-2/';
于 2013-06-26T15:12:03.400 回答
0

如果它位于较大字符串的中间,则可以使用负后瞻(?<!)和负前瞻(?!)

<?php
$string = 'URL 1: /test-category1/test-category-2/
URL 2: /test-category1/test-category-2/test-category3/';


function swapURL($old,$replacement,$string){
    $pattern = '~(?<![A-Za-z0-9])'.$old.'(?![A-Za-z0-9])~';
    $string = preg_replace ($pattern,$replacement,$string);
    return $string;
}

$string = swapURL('/test-category1/test-category-2/','/test-category2/',$string);

echo $string;

?>

输出

URL 1: /test-category2/
URL 2: /test-category1/test-category-2/test-category3/

如果您只对带有 URL 的固定字符串执行此操作(没有新行或其他内容),那么您将捕获该行的开头和结尾。

function swapURL($old,$replacement,$string){
    $pattern = '!^'.$old.'$!';
    $string = preg_replace ($pattern,$replacement,$string);
    return $string;
}

$string = swapURL('/test-category1/test-category-2/','/new-page/',$string);

echo $string;
于 2013-06-28T06:37:04.927 回答