清理文件路径字符串,最后只允许 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/
正则表达式可以改进,注意我们要删除行尾那个之前的所有 /
,并使用积极的前瞻来匹配它们。然后所有的匹配都可以简单地用一个空字符串替换:
$string = 'contr*@&oller_123////method///';
echo preg_replace('#[^\w/-]+|/(?=/+$)#', '', $string);
输出:
controller_123////method/
能否请您尝试以下正则表达式(考虑到您的输入将仅如示例所示):
.*\w\/
在 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/',
)
我需要从字符串末尾删除 _(下划线)和 - 破折号以及一个 /(正斜杠)以外的非字母数字字符。
$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/
正则表达式可以改进,注意我们要删除行尾那个之前的所有 /
,并使用积极的前瞻来匹配它们。然后所有的匹配都可以简单地用一个空字符串替换:
$string = 'contr*@&oller_123////method///';
echo preg_replace('#[^\w/-]+|/(?=/+$)#', '', $string);
输出:
controller_123////method/
能否请您尝试以下正则表达式(考虑到您的输入将仅如示例所示):
.*\w\/
在 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/',
)