web-dev-qa-db-ja.com

Wp_embed_register_handlerの正規表現を修正してください。

目標

URLを解析して投稿のコンテンツの embedded videoプレーヤーに変換しようとしていますが、regExがオフになっているか、 provider を正しく作成していません。

コード

これが私が今セットアップしたものです。

wp_embed_register_handler('brightcove', '/(players.brightcove.net/)([^/]+)/([^/]+)/index\.html\?videoId=([\d]+)/g', 'wp_embed_handler_brightcove');

function wp_embed_handler_brightcove($matches, $attr, $url, $rawattr) {

    // var_dump($matches, $attr, $url, $rawattr);

    $account  = esc_attr($matches[ 1 ]);
    $player   = esc_attr($matches[ 2 ]);
    $video_id = esc_attr($matches[ 3 ]);

    $embed = '<div style="display: block; position: relative; max-width: 142.86%;"><div style="padding-top: 39.3742%;"><iframe src="'
    . sprintf('http://players.brightcove.net/%1$s/%2$s/index.html?videoId=%3$s',
              $account,
              $player,
              $video_id
    ) . '" allowfullscreen="" webkitallowfullscreen="" mozallowfullscreen="" style="width: 100%; height: 100%; position: absolute; top: 0px; bottom: 0px; right: 0px; left: 0px;"></iframe></div></div>';

    return apply_filters('embed_brightcove', $embed, $matches, $attr, $url, $rawattr);
}

テスト

$embed_code = wp_oembed_get('http://players.brightcove.net/1234567890123/default_default/index.html?videoId=1234567789012');

echo $embed_code; // nothing :(

regexr で動作する正規表現があります。

(players.brightcove.net/)([^/]+)/([^/]+)/index\.html\?videoId=([\d]+)

そして探します:

http://players.brightcove.net/{account}/{player_id}/index.html?videoId={video_Id}

RESOURCES

質問

このカスタム埋め込みハンドラを正しく機能させるにはどうすればよいですか。 regExを修正できますか?それともメソッドを正しく呼び出していませんか?


更新:実験

私はしばらく前に VerbalExpressions に遭遇し、私はこれがどのように機能するかを見たかったのです。 PHPバージョンは here ですが、これは私がテストできるJSバージョンを使用しています RegExr または RegEx101

var tester = VerEx()
        .startOfLine()
        .maybe("http")
        .maybe("s")
        .maybe(":")
        .then("//players.brightcove.net/")
        .Word()
        .then('/')
        .Word()
        .then('/index.html?videoId=')
        .Word()
        .maybe('&')
        .anythingBut(" ")
        .endOfLine();

うまくいくようにコンパイルされていますが、それでもクリーンアップが必要です。私が興味を持っているもののグループを作ることと、いくつかの元のグループを一致しないグループに変換することだけが必須です。

// Before

/^(http)(s)?(\:\/\/players\.brightcove\.net\/)\w+(\/)\w+(\/index\.html\?videoId\=)\w+(\&)?([^\ ]*)$/gm

// After

/^(?:http)?(?:s)?(?:\:)?\/\/players\.brightcove\.net\/(\d+)\/(\w+)\/index\.html\?videoId\=(\d+)\&?[^\ ]*$/gm

更新:解決策

アカウントは常に数値になるため、 @ birgireの回答 から若干変更しました。

wp_embed_register_handler(
    'brightcove',
    '#https?://players\.brightcove\.net/([\d]+)/([^/]+)/index\.html\?videoId=([\d]+)#', 
    'wp_embed_handler_brightcove');
4
jgraup

ほんの少しのメモがここにあります。

  • プレースホルダーと混同しないように、sprintf()内で%を使用するように注意する必要があります。 CSSスタイルを削除してみてください。

  • #区切り文字の代わりに~または/delimitersを正規表現で使用する方が簡単なことがあります。

  • 最初の一致として(players.brightcove.net/)があるので、これはこの仮定に一致しないかもしれません:

    $account  = esc_attr( $matches[1] );
    

    代わりに試してください。

    #https?://players\.brightcove\.net/([^/]+)/([^/]+)/index\.html\?videoId=([\d]+)#
    

これはコンテンツエディタでうまくいくようです:

add_action( 'init', function()
{
    wp_embed_register_handler( 
       'brightcove', 
       '#https?://players\.brightcove\.net)/([^/]+)/([^/]+)/index.html\?videoId=([\d]+)#', 
       'wp_embed_handler_brightcove' 
    );
} );

ここでwp_embed_handler_brightcove()は上記の@jgraupで定義されたコールバック関数です。

これが関連した 答え /私は最近取り組んだ。

PHPで遊ぶ言語表現

@jgraup 言及 ライブラリ PHPVerbalExpressions - "PHP正規表現を簡単にする"

これを使用する試みがあります。

$regex = new \VerbalExpressions\PHPVerbalExpressions\VerbalExpressions();

$regex->removeModifier( 'm' )
//      ->startOfLine()
      ->then( 'http' )
      ->maybe( 's' )
      ->then( '://players.brightcove.net/' )
      ->anythingBut( '/' )
      ->then( '/' )
      ->anythingBut( '/' )
      ->then( '/index.html?videoId=' )
      ->add( '([\d]+)' );
//      ->endOfLine();

これにより、次のパターンが生成されます。

/(?:http)(?:s)?(?:\:\/\/players\.brightcove\.net\/)(?:[^\/]*)(?:\/)(?:[^\/]*)(?:\/index\.html\?videoId\=)([\d]+)/

あるいは展開すると

/
   (?:http)
   (?:s)?
   (?:\:\/\/players\.brightcove\.net\/)
   (?:[^\/]*)
   (?:\/)
   (?:[^\/]*)
   (?:\/index\.html\?videoId\=)
   ([\d]+)
/

それに応じて$matchesを使ってマッチしたキーを調整する必要があります。

2
birgire