2

我正在尝试找出一种在 html 文件中的 href 标记的 GET 部分替换 a 的方法,如下所示 /-

blah blah <a href="aaaaa/aaaaa/aaaaa/?q=43/23"> blah blah <a
href="aaaaa/aaaaa/aaaaa/?q=43/11/1"> blah blah blah

所以基本上我希望这两个 URL 分别以?q=43-23and结尾?q=43-11-1

我怎样才能做到这一点preg_replace?我显然43/23可以43-23得到

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

我可以和43/11/143-11-1在一起

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

但是考虑到在?. 有什么建议或可以为我指明正确方向的人吗?

4

3 回答 3

1

这不是最简单的搜索和替换,因为正则表达式引擎如何处理重复的捕获组。 应用重复捕获组原则,您可以使用正则表达式捕获重复组,然后进行简单的字符串替换。

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 以此处结尾),甚至("|').

于 2013-02-18T23:24:39.007 回答
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);

出去;

废话 <a href="aaaaa/aaaaa/aaaaa/?q=43-23"> 废话 <a
href="aaaaa/aaaaa/aaaaa/?q=43-11-1"> 等等等等
哈哈哈哈哈哈哈哈哈哈哈哈
于 2013-02-18T23:38:26.290 回答
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 );
于 2013-02-18T23:07:37.630 回答