清理文件路径字符串,最后只允许 1 个尾部斜杠

Sanitize filepath string and only allow 1 trailing slash at the end

我需要从字符串末尾删除 _(下划线)和 - 破折号以及一个 /(正斜杠)以外的非字母数字字符。

$string = 'controller_123/method///';

$string = 'controller_123/method/';

两者都应该 return: 'controller_123/method/';

我目前尝试过的:

$string = preg_replace('/[^a-zA-Z0-9_]\/$/', '', $string);

您可以将 preg_replace 与模式数组和替换项一起使用;第一个删除 _-/ 以外的非字母数字字符,第二个删除除最后一个尾随 /:

之外的所有字符
$string = 'controller_123/method///';
echo preg_replace(array('#[^\w/-]+#', '#/+$#'), array('', '/'), $string);

输出:

controller_123/method/

Demo on 3v4l.org

正则表达式可以改进,注意我们要删除行尾那个之前的所有 /,并使用积极的前瞻来匹配它们。然后所有的匹配都可以简单地用一个空字符串替换:

$string = 'contr*@&oller_123////method///';
echo preg_replace('#[^\w/-]+|/(?=/+$)#', '', $string);

输出:

controller_123////method/

Demo on 3v4l.org

能否请您尝试以下正则表达式(考虑到您的输入将仅如示例所示):

.*\w\/

Regex DEMO:

php 中尝试执行以下操作。

<html>
<head>
<title>Online PHP Script Execution</title>
</head>
<body>
<?php
   echo "<h1>Hello, PHP!</h1>\n";
   $string = 'controller_123/method///';
   preg_match('/.*\w\//', $string, $matches);
   print_r($matches);
?>
</body>
</html>

当我测试它时在线终端给我以下输出。

$php main.php
<html>
<head>
<title>Online PHP Script Execution</title>
</head>
<body>
<h1>Hello, PHP!</h1>
Array
(
    [0] => controller_123/method/
)
</body>
</html>

使用正则表达式

$string=preg_replace("//$/", '', $string );

使用 strripos() 和 strreplace

$string=str_replace(strripos("/",$string),"",$string)

使用 rtrim()

$string=rtrim("/",$string);

您可以使用一个简单的正则表达式来完成它,其中除字母数字、下划线或连字符之外的每个字符都将替换为空字符串,并且字符串末尾的两个以上正斜杠将替换为单个 / .只需替换此正则表达式,

[^\w-/]+|(/)/+$

</code></p> <p><strong><a href="https://regex101.com/r/jI1W1q/3" rel="nofollow noreferrer">Demo</a></strong></p> <p>PHP演示,</p> <pre><code>$s = "controller_123/method///"; echo preg_replace('@[^\w-/]|(/)/+$@', '', $s);

打印,

controller_123/method/

无需环视、捕获组、单个模式和单个空替换字符串即可完成此任务。

[^-\w/]+   #match one or more non-dash, non-word, non-slash characters
|          #or
/\K/+$     #match a slash, then forget it, them match one or more slash until the end of the string

我将在一个字符串数组上进行演示,但 preg_replace() 会像第三个参数一样愉快地替换字符串。

代码:(Demo)

$strings = [
    'controller_123/method///',
    'controller_123/method/',
    '% con $trol@$@ler_!123/me*thod////',
];

var_export(
    preg_replace(
        '~[^-\w/]+|/\K/+$~',
        '',
        $strings
    )
);

输出:

array (
  0 => 'controller_123/method/',
  1 => 'controller_123/method/',
  2 => 'controller_123/method/',
)