8640
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で出力しても結果は変わりませんでした。  
そもそもが無理な話なのでしょうか？

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

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

```

    <?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();
    ?>
    
```

上記がドメインを表示させない処理となっております。
CC BY-SA 3.0
2015-03-31T05:01:11.567
8594
2015-04-01T05:12:23.563
2015-03-31T15:26:53.930
7887
7887
question
php html wordpress
ドメイン文字列を、add_filterで削除しているが特定のAタグの中身だけ残したい。
`delete_host_from_attachment_url`を以下のように変えてみて試してみて下さい。  
おそらくこれでいけるかと思いますが、すみません自信ありません。

```

    function delete_host_from_attachment_url($url) {
        $regixFeedly = '/^(http(s)?:\/\/feedly.*?)\/(http.+)$/';
        $regex = '/^http(s)?:\/\/[^\/\s]+(.*)$/';
        if (preg_match($regixFeedly, $url, $m)) {
            // http(s)://feedlyから始まるときに
            // httpが含まれていれば次のhttp以降の文字列をURLエンコードする
            $url = $m[1].'/'.urlencode($m[3]);
        } elseif (preg_match($regex, $url, $m)) {
            $url = $m[2];
        }
        return $url;
    }
    
```

```

    // https://feedlyから始まる場合
    $url = 'https://feedly.co.jp/i/subscription/feed/http://hogehoge.com/?feed=rss2';
    echo delete_host_from_attachment_url($url);
    // 結果
    https://feedly.co.jp/i/subscription/feed/http%3A%2F%2Fhogehoge.com%2F%3Ffeed%3Drss2
    
```

```

    // https://feedlyから始まる場合2
    $url = 'https://feedly.co.jp/i/subscription/feed/abc.png';
    echo delete_host_from_attachment_url($url);
    // 結果
    /i/subscription/feed/abc.png
    
```

```

    // http://fugafugaから始まる場合
    $url = 'https://fugafuga.co.jp/i/subscription/feed/http%3A%2F%2Fhogehoge.com%2F%3Ffeed%3Drss2';
    echo delete_host_from_attachment_url($url);
    // 結果
    /i/subscription/feed/http://hogehoge.com/?feed=rss2
    
```

```

    // http://fugafugaから始まる場合2
    $url = 'https://fugafuga.co.jp/i/subscription/feed/abc.png';
    echo delete_host_from_attachment_url($url);
    // 結果
    /i/subscription/feed/abc.png
    
```
CC BY-SA 3.0
2015-03-31T13:05:29.953
8616
2015-03-31T14:07:57.693
2015-03-31T14:07:57.693
8963
8963
8594
answer
[WordPress で URL をすべて相対 URL にする方法 |
dogmap.jp](http://dogmap.jp/2011/03/18/wordpress-relative-url/)

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

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

```

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

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

* * *

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

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

```

    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);
    }
    
```

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

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

```

    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);
    }
    
```

実行例 <http://melpon.org/wandbox/permlink/PgZDbsogi1BnO2BN>
CC BY-SA 3.0
2015-04-01T05:12:23.563
8640
2015-04-01T05:12:23.563
8000
8594
answer