web-dev-qa-db-ja.com

拡張する PHP "srcset"と "style"属性をカバーするための正規表現

すべてのリンクを プロトコル相対URLhttp:https:の削除)に変換するプラグインを作成しました。 $tagおよび$attribute変数これは関数の一部です。スペースを節約するために、 残りのコードはここにあります

$tag = 'a|base|div|form|iframe|img|link|meta|script|svg';
$attribute = 'action|content|data-project-file|href|src|srcset|style';
# If 'Protocol Relative URL' option is checked, only apply change to internal links
if ( $this->option == 1 ) {
    # Remove protocol from home URL
    $website = preg_replace( '/https?:\/\//', '', home_url() );
    # Remove protocol from internal links
    $links = preg_replace( '/(<(' . $tag . ')([^>]*)(' . $attribute . ')=["\'])https?:\/\/' . $website . '/i', '$1//' . $website, $links );
}
# Else, remove protocols from all links
else {
    $links = preg_replace( '/(<(' . $tag . ')([^>]*)(' . $attribute . ')=["\'])https?:\/\//i', '$1//', $links );
}

これは意図したとおりに機能しますが、次の例では機能しません。

<!-- Within the 'style' attribute -->
<div class="some-class" style='background-color:rgba(255,255,255,0);background-image:url("http://placehold.it/300x200");background-position:center center;background-repeat:no-repeat'>
<!-- Within the 'srcset' attribute -->
<img src="http://placehold.it/600x300" srcset="http://placehold.it/500 500x, http://placehold.it/100 100w">

ただし、コードはこれらの例では部分的に機能します。

<div class="some-class" style='background-color:rgba(255,255,255,0);background-image:url("http://placehold.it/300x200");background-position:center center;background-repeat:no-repeat'>
<img src="http://placehold.it/600x300" srcset="//placehold.it/500 500x, http://placehold.it/100 100w">

私は$tag$attribute変数に追加の値を追加することで遊んだが、それは助けにはならなかった。これら2つの追加タグをカバーするために正規表現の残りを更新する必要があると思いますか?それとも、 DOMDocument のように、別の方法でアプローチすることはできますか?

私は次の正規表現を使ってすべてのタグと属性をプロトコルでカバーすることができました。

/<(?:input\b[^<]*\bvalue=[\"\']https?:\/\/|link\b[^<]*?\brel=[\'\"]canonical[\'\"][^<]*?>)(*SKIP)(*F)|https?:\/\//

これは更新されたセクションです:

# If 'Relative' option is selected, remove domain from all internal links
$exceptions = '<(?:input\b[^<]*\bvalue=[\"\']https?:\/\/|link\b[^<]*?\brel=[\'\"]canonical[\'\"][^<]*?>)(*SKIP)(*F)';
if ( $this->option == 2 ) {
    $website = preg_replace( '/https?:\/\//', '', home_url() );
    $links = preg_replace( '/' . $exceptions . '|https?:\/\/' . $website . '/', '', $links );
}
# For all external links, remove protocols
$links = preg_replace( '/<(?:input\b[^<]*\bvalue=[\"\']https?:\/\/|link\b[^<]*?\brel=[\'\"]canonical[\'\"][^<]*?>)(*SKIP)(*F)|https?:\/\//', '//', $links );