我遇到了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);
?>
我没有与我的正则表达式匹配。我在这里缺少什么?
答案 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之外的所有字符串)