我正在尝试找出一种方法,在html文件的href标记的GET部分中用/
替换-
,如下所示:
blah blah <a href="aaaaa/aaaaa/aaaaa/?q=43/23"> blah blah <a
href="aaaaa/aaaaa/aaaaa/?q=43/11/1"> blah blah blah
所以基本上我希望这两个网址分别以?q=43-23
和?q=43-11-1
结尾。
如何使用preg_replace
执行此操作?我显然可以43/23
与43-23
一起使用
/(\?.+?)\/(.+?)$/is
我可以{/ 1}} {/ 1}} {/ 1}}
43/11/1
但考虑到43-11-1
之后可能存在无限数量的斜杠,我怎样才能在单个正则表达式中执行此操作。有什么建议或者能指出我正确方向的人吗?
答案 0 :(得分:1)
这不是最简单的搜索和替换,因为正则表达式引擎处理重复的捕获组。 Applying repeated capture group principles,您可以使用正则表达式捕获重复组,然后执行简单的字符串替换。
preg_replace_callback('/
( # start capture
\? # question mark
.+? # reluctantly capture all until...
) # end capture
( # start capture
(?: # start group (no capture)
\/ # ...a literal slash
.+? # reluctantly capture all until...
) # end group
+ # repeat capture group
) # end capture
( # start capture
\b # ...a word boundary
) # end capture
/isx', function ($matches) {
return $matches[1] . str_replace('/', '-', $matches[2]) . $matches[3];
}, $str));
在第二场比赛中进行字符串替换,即重复的组捕获。最后的单词边界是必要的,但它可以替换为更合理或更正确的内容,例如"
(如果您知道URL在此处结束),甚至是("|')
。
答案 1 :(得分:1)
我认为您的内容可能很容易;
print preg_replace_callback('~\?q=([^&"]*)~', function($m) {
return '?q='. str_replace('/', '-', $m[1]);
}, $s);
// for PHP < 5.3.0
print preg_replace_callback('~\?q=([^&"]*)~', create_function(
'$m', 'return "?q=". str_replace("/", "-", $m[1]);'
), $s);
出;
blah blah <a href="aaaaa/aaaaa/aaaaa/?q=43-23"> blah blah <a href="aaaaa/aaaaa/aaaaa/?q=43-11-1"> blah blah blah blah blah blah blah blah blah blah
答案 2 :(得分:0)
您可以在查询参数 q = 之后使用此正则表达式匹配无限量(斜杠)级别。
// Using tilde delimiters because hash signs are interpreted as comments here :)
~q=((?:[^/]+|/|)*)$~i
例如,使用字符串“aaaaa / aaaaa / aaaaa /?q = 43/11/1/5/10”,第一个捕获的组将包含 43/11/1 / 5/10 强>
之后,您可以执行以下操作以使用连字符替换斜杠:
<?php str_replace( '/', '-', $string );