正则表达式:在给定市场之后替换未知数量的事件

时间:2013-02-18 22:31:21

标签: php regex preg-replace

我正在尝试找出一种方法,在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/2343-23一起使用

/(\?.+?)\/(.+?)$/is

我可以{/ 1}} {/ 1}} {/ 1}}

43/11/1

但考虑到43-11-1之后可能存在无限数量的斜杠,我怎样才能在单个正则表达式中执行此操作。有什么建议或者能指出我正确方向的人吗?

3 个答案:

答案 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 );