0

人々が更新を投稿する入力エリアがあります。だから私はYouTubeのリンクをフィルタリングし、それらを変更して最後に追加したいと考えています。

<br>このコンテンツは html ではなく、 orさえありません<p>。純粋な文字列です。

これは、プログラムのさまざまな部分から取得したコードです。

これがすべきことは、すべての一致を取得して、それらを html に置き換えることです。

function aKaFilter( $content ) {
    global $bp;

    $pattern2 = '#^(?:https?://)?(?:www\.)?(?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})(?:.+)?$#x';
    preg_match_all( $pattern2, $content, $youtubes );
    if ( $youtubes ) {
        /* Make sure there's only one instance of each video */
        if ( !$youtubes = array_unique( $youtubes[1] ) )
            return $content;

        //but we need to watch for edits and if something was already wrapped in html link - thus check for space or word boundary prior
        foreach( (array)$youtubes as $youtube ) {
            $pattern = "NEW". $youtube ."PATTERN TO MATCH THIS LINK";
            $content = preg_replace( $pattern, '<span class="video youtube" data-trigger="'.$youtube.'"><img src="http://img.youtube.com/vi/'.$youtube.'/0.jpg"><span class="icon-stack"><i class="icon-circle icon-stack-base"></i><i class="icon-youtube-play"></i></span><span>title</span></span>', $content );
        }
    }

    return $content;
}

ここに元のコードがあります:

function etivite_bp_activity_hashtags_filter( $content ) {
global $bp;

//what are we doing here? - same at atme mentions
//$pattern = '/[#]([_0-9a-zA-Z-]+)/';
$pattern = '/(?(?<!color: )(?<!color: )[#]([_0-9a-zA-Z-]+)|(^|\s|\b)[#]([_0-9a-zA-Z-]+))/';

preg_match_all( $pattern, $content, $hashtags );
if ( $hashtags ) {
    /* Make sure there's only one instance of each tag */
    if ( !$hashtags = array_unique( $hashtags[1] ) )
        return $content;

    //but we need to watch for edits and if something was already wrapped in html link - thus check for space or word boundary prior
    foreach( (array)$hashtags as $hashtag ) {
        $pattern = "/(^|\s|\b)#". $hashtag ."($|\b)/";
        $content = preg_replace( $pattern, ' <a href="' . $bp->root_domain . "/" . $bp->activity->slug . "/". BP_ACTIVITY_HASHTAGS_SLUG ."/" . htmlspecialchars( $hashtag ) . '" rel="nofollow" class="hashtag">#'. htmlspecialchars( $hashtag ) .'</a>', $content );
    }
}

return $content;
}

それが何をするかというと、textarea を取り、#hash の代わりに<a>#hash</a> 、ソーシャル メディアで見られるようなハッシュタグに置き換えます。

私の機能がやりたいことは、YouTubeリンクを取得して<a>ID</a>(基本的に)変換することです

YouTubeリンクしかない場合は問題なく動作しますが、前後に文字列がある場合は、おかしくなります。

2番目の $pattern を思いつかなかったので、うまくいかないと思います。他のプログラムにありました。

4

4 に答える 4

1

なぜ preg_replace() が必要なのですか? あなたの場合は str_replace() で十分です。また、おそらく $youtubes ではなく、$youtubes[0] を繰り返し処理する必要があります。さらに、コードを簡素化します。;-)

したがって、これは機能するはずです:

function aKaFilter( $content ) {
    global $bp;

    $pattern2 = '#^(?:https?://)?(?:www\.)?(?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})(?:.+)?$#x';
    preg_match_all( $pattern2, $content, $youtubes );

    /* Make sure there's only one instance of each video */
    $youtubes = array_unique( $youtubes[1] );

    if ( $youtubes ) {

        //but we need to watch for edits and if something was already wrapped in html link - thus check for space or word boundary prior
        foreach( $youtubes[0] as $youtube ) {

            $content = str_replace( $youtube, '<span class="video youtube" data-trigger="'.$youtube.'"><img src="http://img.youtube.com/vi/'.$youtube.'/0.jpg"><span class="icon-stack"><i class="icon-circle icon-stack-base"></i><i class="icon-youtube-play"></i></span><span>title</span></span>', $content );
        }
    }

    return $content;
}
于 2013-10-05T18:21:59.223 に答える
1

テキストで正規表現を使用して URL を照合しようとするときの問題は、URL がいつ終了するかがわからないことです。

URL には「スペース」、.,およびその他の文字を含めることができるため、新しい単語が始まったときや文が終わったときに URL が終了するとは言えません。さらに、正規表現の末尾は(?:.+)?(ほぼ)すべてに一致します。

yutube URL に (URL の特定の位置/インデックスの後に) 空白を含めることができないと仮定する場合、正規表現の末尾を(?:[^\s]+)?(空白以外のすべて) で変更できます。セットに他の文字を追加できます。 URL の末尾を定義するために、たとえば、URL に,どちらも含めてはならない場合は、次(?:[^\s,]+)?のようにします。

次に、正規表現 ( ^and $) に開始アンカーと終了アンカーを設定します。URL がテキストで囲まれている場合は機能しない可能性があるため、これらのアンカーを削除\bし、正規表現の先頭に (単語境界) アンカーを追加できます。

ちなみに、次のように置き換えることが(?:.+)?できます.*(?:[^\s,]+)?`[^\s,]*

あなたは今、そのような正規表現を持っています:'#\b(?:https?://)?(?:www\.)?(?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})[^\s,]*#x'

注意。私はあなたの正規表現のすべてのロジックを分析したわけではないので、私のコメントはあなたの正規表現の最初と最後にのみ価値があります。

于 2013-10-08T12:34:15.460 に答える
1

これには正規表現を使用しないでくださいparse_url

例えば:

$parsed_url = parse_url($content);
if (in_array($parsed_url['host'], array('www.youtube.com', 'youtube.com', 'www.youtube-nocookie.com', 'youtube-nocookie.com'))) {
    ## Now look through $parsed_url['query'] for the video ID
    ## Parsing this out is a separate question :)
}
于 2013-10-01T21:47:33.433 に答える