preg_replace不匹配

时间:2012-11-08 23:43:30

标签: php regex

我遇到了preg_replace的问题,因为我不熟悉正则表达式。

我正在使用this tool进行测试,但替换无法按预期工作。

我有这个输入:http://example.com/test-menu/d/C101。 我期待这个输出:http://example.com/test-menu/d/101。我只想删除字母C

d可以是任何字母数字字符)

我正在尝试使用此正则表达式。

以下是该网站正在生成的php:

<?php 
    $ptn = "/\/test-menu\/(.)\/C/";
    $str = "http://example.com/test-menu/d/C101";
    $rpltxt = "/test-menu/$1";
    echo preg_replace($ptn, $rpltxt, $str);
?>

我没有与我的正则表达式匹配。我在这里缺少什么?

2 个答案:

答案 0 :(得分:2)

您的主要问题是$rpltxt中的变量在调用preg_replace()之前已展开。

我还将数字捕获添加到结尾,并使第一次捕获特定于字母字符。在你的模式中尽可能具体化是件好事。

<?php 
$ptn = "#/test-menu/([a-zA-Z])/C(\d+)#";
$str = "http://example.com/test-menu/d/C101";
$rpltxt = '/test-menu/$1/$2';
echo preg_replace($ptn, $rpltxt, $str);

更新:根据 cbuckley 更漂亮的评论更改了正则表达式分隔符。

答案 1 :(得分:2)

或者:

$ptn = '/(?<=\/test-menu\/.\/)C/';
$rpltext = '';

(使用(?<= ... )的正面观察)

或者:

$ptn = '/(\/test-menu\/.\/)C/';
$rpltext = '$1';

(它捕获第一个子匹配中的所有前一个字符串,除了C之外的所有字符串)