正确的正则表达式用于wp_emed_Register_Handler

时间:2016-01-07 作者:jgraup

THE GOAL

我正在尝试解析url并将其转换为embedded 我的帖子内容中有视频播放器,但我认为我的正则表达式已关闭,或者我没有创建provider 正确地

THE CODE

这是我现在的设置。

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);
}
<小时>

TESTING

$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

THE QUESTION

如何使此自定义嵌入处理程序正常运行?我可以修复我的regEx吗?或者我没有正确调用这些方法吗?

<小时>

UPDATE: Experiment

我遇到了VerbalExpressions 不久前,我想看看这是怎么回事。PHP版本为here, 但这是我可以测试的JS版本RegExrRegEx101:

var tester = VerEx()
        .startOfLine()
        .maybe("http")
        .maybe("s")
        .maybe(":")
        .then("//players.brightcove.net/")
        .word()
        .then(\'/\')
        .word()
        .then(\'/index.html?videoId=\')
        .word()
        .maybe(\'&\')
        .anythingBut(" ")
        .endOfLine();
虽然它可以编译成一些有用的东西,但仍需要一些清理。Essential只对我感兴趣的事物进行分组,并将一些原始组转换为非匹配组。

// 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
<小时>

UPDATE: SOLUTION

略微修改自@birgire\'s answer 因为帐户将始终是数字。

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

1 个回复
最合适的回答,由SO网友:birgire 整理而成

这里只有几条注释:

我们必须小心使用% 在内部sprintf() 避免与占位符混淆。尝试删除CSS样式。

有时使用#~ 正则表达式中的分隔符,而不是/ 分隔符。

既然你有(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定义的回调函数。

这里有一个相关的answer 我最近工作过。

玩PHPVerbalExpressionsmentioned 图书馆PHPVerbalExpressions - "PHP Regular expressions made easy".

下面是使用它的尝试:

$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.

相关推荐

显示作者姓名PHP(自制插件)

我有一个需要帮助的问题,因为我自己找不到解决办法。我接管了一个网站,之前有人在那里创建了一个自制插件。。使用默认插件“Contact Form 7”,用户可以在页面上创建帖子。()https://gyazo.com/c8b20adecacd90fb9bfe72ad2138a980 )关于自行创建的插件“Contact Form 7 extender”,帖子是通过PHP代码在后台生成的(https://gyazo.com/115a6c7c9afafd2970b66fd421ca76a3)其工作原理如下:如果