2

次のような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

したがって、基本的には、2つのURL?q=43-23?q=43-11-1それぞれとで終わらせることを目指しています。

どうすればこれを行うことができpreg_replaceますか?私は明らかに一緒にいることができ43/23ます43-23

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

そして、私は一緒にいることができ43/11/1ます43-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));

繰り返されるグループキャプチャである2番目の一致で文字列置換を実行します。"最後の単語の境界は必要ですが、(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);

外;

何とか何とか<ahref="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 に答える