Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何使用Apache重写规则删除中间的特定字符_Regex_Apache_.htaccess - Fatal编程技术网

Regex 如何使用Apache重写规则删除中间的特定字符

Regex 如何使用Apache重写规则删除中间的特定字符,regex,apache,.htaccess,Regex,Apache,.htaccess,我有一个像 不幸的是,URI中的捕获组(abc、def、cde..)的数量不是固定的 我尝试编写如下规则,但它只匹配和替换三个组(两个字符组和一个+之间) 举例如下: 来源:example.com/abc+def+cde+x+y(n个字符串,以+)分隔 目标必须是:example.com/abccdexy…直到n如果可以向主配置添加指令,最好的解决方案是使用RewriteMap通过您编写的外部脚本处理URL重写。你可以找到 基本上你会做一些类似的事情: RewriteMap convertUrl

我有一个像

不幸的是,URI中的捕获组(abc、def、cde..)的数量不是固定的

我尝试编写如下规则,但它只匹配和替换三个组(两个字符组和一个+之间)

举例如下:

来源:example.com/abc+def+cde+x+y(n个字符串,以+)分隔

目标必须是:example.com/abccdexy…直到n

如果可以向主配置添加指令,最好的解决方案是使用
RewriteMap
通过您编写的外部脚本处理URL重写。你可以找到

基本上你会做一些类似的事情:

RewriteMap convertUrl "prg:/www/bin/convertUrl.pl"
RewriteRule \+ ${convertUrl:%{REQUEST_URI}} [R=301,L]
(只有
重写映射
需要进入主配置,
重写规则
可以进入
.htaccess

其中
/www/bin/convertUrl.pl
是您为处理替换而编写的脚本,如上面的链接所述。它应该在STDIN上获取URL(没有任何缓冲),去掉加号,然后在STDOUT上返回它

像这样的方法应该会奏效:

#!/usr/bin/perl
$| = 1; # Turn off I/O buffering
while (<STDIN>) {
    s/\+//g; # Replace dashes with underscores
    print $_;
}
#/usr/bin/perl
$| = 1; # 关闭I/O缓冲
而(){
s/\+//g;#用下划线替换短划线
打印美元;
}

如果可以在主配置中添加指令,最好的解决方案是使用
重写映射
,该映射通过您编写的外部脚本处理URL重写。你可以找到

基本上你会做一些类似的事情:

RewriteMap convertUrl "prg:/www/bin/convertUrl.pl"
RewriteRule \+ ${convertUrl:%{REQUEST_URI}} [R=301,L]
(只有
重写映射
需要进入主配置,
重写规则
可以进入
.htaccess

其中
/www/bin/convertUrl.pl
是您为处理替换而编写的脚本,如上面的链接所述。它应该在STDIN上获取URL(没有任何缓冲),去掉加号,然后在STDOUT上返回它

像这样的方法应该会奏效:

#!/usr/bin/perl
$| = 1; # Turn off I/O buffering
while (<STDIN>) {
    s/\+//g; # Replace dashes with underscores
    print $_;
}
#/usr/bin/perl
$| = 1; # 关闭I/O缓冲
而(){
s/\+//g;#用下划线替换短划线
打印美元;
}

这是一个纯
.htaccess
解决方案

# Remove a plus sign on each iteration of the rule
RewriteRule ^help/col/([^+/]+)\+([^/]+)$ help/col/$1$2 [E=REMOVED_PLUS_SIGNS:1]
# For URLs that were processed, redirect once all the plus signs are removed
RewriteCond %{ENV:REMOVED_PLUS_SIGNS} =1
RewriteRule ^help/col/([^+/]+)$ /help/col/$1 [R=301,L]

这是一个纯
.htaccess
解决方案

# Remove a plus sign on each iteration of the rule
RewriteRule ^help/col/([^+/]+)\+([^/]+)$ help/col/$1$2 [E=REMOVED_PLUS_SIGNS:1]
# For URLs that were processed, redirect once all the plus signs are removed
RewriteCond %{ENV:REMOVED_PLUS_SIGNS} =1
RewriteRule ^help/col/([^+/]+)$ /help/col/$1 [R=301,L]


你想达到什么目的?请根据您对规则的意图更新问题。来源:由++目的地分隔的字符串数必须为:nTanks,我提供了答案。请阅读有关紧急乞讨的内容,谢谢。你想达到什么目的?请根据您对规则的意图更新问题。来源:由++目的地分隔的字符串数必须为:nTanks,我提供了答案。请阅读有关紧急乞讨的内容,谢谢。他正在使用.htaccess和RewriteMap在这个上下文中不起作用。你能发布一个基于htaccess的解决方案吗?很好,我更新了答案,指出了这一点。我将考虑纯
.htaccess
解决方案。我添加了纯
.htaccess
解决方案作为第二个答案。我的IBM HTTP服务器不支持重写映射。我需要.htaccess解决方案。前面给出的解决方案是只替换一次,只执行一次。如果可能,请使用.htaccess答案进行帮助。请重试,我在添加/help/col部分时出错,现在应该可以工作了。这是一个.htaccess答案。他正在使用.htaccess和RewriteMap在这个上下文中不起作用。你能发布一个基于htaccess的解决方案吗?很好,我更新了答案,指出了这一点。我将考虑纯
.htaccess
解决方案。我添加了纯
.htaccess
解决方案作为第二个答案。我的IBM HTTP服务器不支持重写映射。我需要.htaccess解决方案。前面给出的解决方案是只替换一次,只执行一次。如果可能,请使用.htaccess答案进行帮助。请重试,我在添加/help/col部分时出错,现在应该可以工作了。这是一个.htaccess答案。您能解释一下规则重写规则^([^+/]+)\+([^/]+)$$1$2[E=REMOVED\u PLUS\u SIGNS:1]将如何在循环中执行吗。它实际上只删除了一个加号,因为它只被解析一次。因为mod_重写规则是循环的,直到它们再次返回相同的URL。你试过了吗?它工作得很好,在这里进行了测试,并且不仅解析了一次,这似乎是您正在做的一个假设。重写规则^/help/col/([^+/]+)\+([^/]+)$[E=REMOVED\u PLUS\u SIGNS:1]重写第二个%{ENV:REMOVED\u PLUS\u SIGNS}=1重写规则^/help/col/([^+/]+)$[R=301,L]如果我犯了任何错误,请纠正我。如果它不起作用,请告诉我,我会仔细看看。请接受答案并在其左上角打勾,以显示它回答了您的查询。很抱歉,实际上是的,您需要删除开头的斜杠,因为该斜杠不包含在.htaccess匹配中。并在最后一条规则中的$1之前添加“help/col/”。并从第一条规则中删除example.com。相信回答问题的人知道他们在做什么。我相应地更新了我的答案。你能解释一下规则重写规则^([^+/]+)\+([^/]+)$$1$2[E=REMOVED\u PLUS\u SIGNS:1]将如何在循环中执行吗。它实际上只删除了一个加号,因为它只被解析一次。因为mod_重写规则是循环的,直到它们再次返回相同的URL。你试过了吗?它工作得很好,在这里进行了测试,并且不仅解析了一次,这似乎是您正在做的一个假设。重写规则^/help/col/([^+/]+)\+([^/]+)$[E=REMOVED\u加号:1]RewriteCon