0

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

我正在使用此工具进行测试,但替换未按预期工作。

我有这个输入: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);
?>

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

4

2 回答 2

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更漂亮的评论更改了正则表达式分隔符。

于 2012-11-08T23:50:00.327 回答
2

任何一个:

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

(它使用积极的向后看(?<= ... )

或者:

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

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

于 2012-11-08T23:50:10.993 回答