ドメイン文字列を、add_filterで削除しているが特定のAタグの中身だけ残したい。


WEBページを制作しておりまして、feedlyのリンクを設置しようと思いました。  
feedlyで取得したURLをアンカータグに設置したのですが、URLを正しく読み込んでくれません。

HTMLタグは

`<a class="RSS"
href="https://feedly.com/i/subscription/feed/http://hogehoge.com/?feed=rss2">hoge</a>`

といったURLですが  
`https://feedly.com/i/subscription/feed//?feed=rss2`  
といった感じで、`http://hogehoge.com`の部分が省略されてしまいます。  
消えてしまうURLの部分をechoで出力しても結果は変わりませんでした。  
そもそもが無理な話なのでしょうか？

## 原因の自己解決と追加の質問

原因がわかりました。  
ドメインを表示させない処理を行っておりました。  
この処理はできれば残しておきたいのですが……。  
この処理を残したまま、フィード用のリンクのみドメインを出力させる方法はございますか？

[code]

    <?php
    class relative_URI {
        function relative_URI() {
            add_action('get_header', array(&$this, 'get_header'), 1);
            add_action('wp_footer', array(&$this, 'wp_footer'), 99999);
        }
        function replace_relative_URI($content) {
            $home_url = trailingslashit(get_home_url('/'));
            return str_replace($home_url, '/', $content);
        }
        function get_header(){
            ob_start(array(&$this, 'replace_relative_URI'));
        }
        function wp_footer(){
            ob_end_flush();
        }
    }
    new relative_URI();
    ?>
    
[/code]

上記がドメインを表示させない処理となっております。




[WordPress で URL をすべて相対 URL にする方法 |
dogmap.jp](http://dogmap.jp/2011/03/18/wordpress-relative-url/)

「get_header～wp_footerの間に出力された文字列に含まれる、サイトのホームURLを全て除去する」みたいなことになるので、確かに今回の問題が起きると思います。なかなか豪快な処理ですね・・・。

本文にベタ書きされたものは処理しなくていいのなら、 `="http://...` だけ置換するようにすれば、URLの先頭だけを消せます。

[code]

    // 略
    
    function replace_relative_URI($content) {
        $home_url = trailingslashit(get_home_url('/'));
        return str_replace('="'.$home_url, '="/', $content);
    }
    
    // 略
    
[/code]

実行例 <http://melpon.org/wandbox/permlink/2xDBQR3qnPIhUi7i>

* * *

恐らく上の方法で問題ないと思いますが、他の方法も参考までに載せておきます。

正規表現の[戻り読み言明](http://php.net/manual/ja/regexp.reference.assertions.php)で、スラッシュが前についてる時は消さないようにする方法。

[code]

    function replace_relative_URI($content) {
        $home_url = trailingslashit(get_home_url('/'));
        $home_url_pattern = preg_quote($home_url, '#');
        return preg_replace('#(?<!/)'.$home_url_pattern.'#u', '/', $content);
    }
    
[/code]

実行例 <http://melpon.org/wandbox/permlink/7GGPiLwV6qx5bOpv>

スラッシュに続くホームURLをURLエンコードする方法。ホームURL以降のスラッシュはエンコードされないのが微妙です（Feedlyでは動きます）。

[code]

    function replace_relative_URI($content) {
        $home_url = trailingslashit(get_home_url('/'));
        $escaped_content = str_replace('/'.$home_url, '/'.urlencode($home_url), $content);
        return str_replace($home_url, '/', $escaped_content);
    }
    
[/code]

実行例 <http://melpon.org/wandbox/permlink/PgZDbsogi1BnO2BN>




[WordPress で URL をすべて相対 URL にする方法 |
dogmap.jp](http://dogmap.jp/2011/03/18/wordpress-relative-url/)

「get_header～wp_footerの間に出力された文字列に含まれる、サイトのホームURLを全て除去する」みたいなことになるので、確かに今回の問題が起きると思います。なかなか豪快な処理ですね・・・。

本文にベタ書きされたものは処理しなくていいのなら、 `="http://...` だけ置換するようにすれば、URLの先頭だけを消せます。

[code]

    // 略
    
    function replace_relative_URI($content) {
        $home_url = trailingslashit(get_home_url('/'));
        return str_replace('="'.$home_url, '="/', $content);
    }
    
    // 略
    
[/code]

実行例 <http://melpon.org/wandbox/permlink/2xDBQR3qnPIhUi7i>

* * *

恐らく上の方法で問題ないと思いますが、他の方法も参考までに載せておきます。

正規表現の[戻り読み言明](http://php.net/manual/ja/regexp.reference.assertions.php)で、スラッシュが前についてる時は消さないようにする方法。

[code]

    function replace_relative_URI($content) {
        $home_url = trailingslashit(get_home_url('/'));
        $home_url_pattern = preg_quote($home_url, '#');
        return preg_replace('#(?<!/)'.$home_url_pattern.'#u', '/', $content);
    }
    
[/code]

実行例 <http://melpon.org/wandbox/permlink/7GGPiLwV6qx5bOpv>

スラッシュに続くホームURLをURLエンコードする方法。ホームURL以降のスラッシュはエンコードされないのが微妙です（Feedlyでは動きます）。

[code]

    function replace_relative_URI($content) {
        $home_url = trailingslashit(get_home_url('/'));
        $escaped_content = str_replace('/'.$home_url, '/'.urlencode($home_url), $content);
        return str_replace($home_url, '/', $escaped_content);
    }
    
[/code]

実行例 <http://melpon.org/wandbox/permlink/PgZDbsogi1BnO2BN>

