PHP替换后面没有任何内容的字符串

时间:2013-06-26 15:08:37

标签: php regex

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

我有以下情况:

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

我怎样才能用某些内容替换第一个URL,只有在最后一个/之后没有任何内容?我只对URL1而不是URL2进行替换吗?

4 个答案:

答案 0 :(得分:4)

这得到了-1:

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;
}

答案 1 :(得分:2)

要明确的是,您要求在确切的网址上替换正则表达式/test-category1/test-category-2/而不是其他内容。鉴于这些要求,这就是你想要的:

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

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

答案 2 :(得分:0)

怎么样:

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

但如果您真的想要/test-category1/test-category-2/完全替换/test-category-2/,则此处不需要正则表达式:

if ($url == '/test-category1/test-category-2/')
    $url = '/test-category-2/';

答案 3 :(得分:0)

如果它位于较大字符串的中间,则可以使用negative lookbehind (?<!) and negative lookahead (?!)

<?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;