1

私は何年も正規表現を理解しようとしてきましたが、役に立ちませんでした!

私は、ユーザーがテキストなどを投稿したり、YouTube や soundcloud 埋め込みコードを投稿したりできるシステム (わかりやすくするためのフォーラムとしましょう) を持っています。送信されたコンテンツをクリーンアップするためのフィルターを作成しています (および htmlpurifier を使用しています)。私たちのサイトは SSL であるため、埋め込みコードを https:// にフォーマットし、iframe のサイズなどを変更したいので、すべての youtube と soundcloud の iframe をキャッチし、それらをタグに変換します"%youtube_embed%=dhusydg"。すべての iframe など、私の形式に従って youtube/soundcloud iframe 埋め込みを構築します。

これが私が持っているものです...それは機能していません!

$string = preg_replace('/<iframe width="420" height="315" src="http\:\/\/www.youtube.com\/embed\/(.*)" frameborder="0" allowfullscreen>\<\/iframe>/', '%youtube_embed%=$1', $string);

これは、標準の youtube 埋め込みコードを見つけて、URL からビデオ ID を抽出し、後で置き換えることができる文字列に変換することを想定しています。しかし、正規表現に頭を悩ませることができないため、何も起こりません! どうすればいいですか?

4

2 に答える 2

1
<?php
$string = '<iframe allowfullscreen frameborder="0" height="315"
src="youtube.com/embed/xxxx"; width="420"></iframe>
text
<iframe allowfullscreen frameborder="0" height="315" src="youtube.com/embed/xxxx"; width="420"></iframe> text';
$string = preg_replace(
'/<iframe.*?src="youtube.com\/embed\/(.*?)".*?<\/iframe>/si',
'%youtube_embed%=$1', $string);
print $string;

プリント:

%youtube_embed%=xxxx
text
%youtube_embed%=xxxx text

正規表現に s および i 修飾子を使用して、改行を無視し、検索で大文字と小文字を区別しないようにしました。

http://www.php.net/manual/en/reference.pcre.pattern.modifiers.php

于 2013-06-10T22:11:57.913 に答える
0

私を正しい方向に導いてくれたuser4035の助けに感謝します。完成したコードは次のようになります。

    $string = '<iframe width="420" height="315" src="http://www.youtube.com/embed/xxxxxx"></iframe>';

    // immunize youtube iframe from filter
    $clean = preg_replace('/<iframe.*?src="http:\/\/www\.youtube\.com\/embed\/(.*)".*?\/iframe>/si','%youtube_embed%=$1',  html_entity_decode($string));
    // apply filtering here e.g removing non youtube iframes etc.

    // create youtube iframe to our own format e.g add class, convert to ssl and change player size etc
    $clean = preg_replace('/%youtube_embed%=(.*)/si','<iframe class="youtube" width="300" height="250" scrolling="no" frameborder="no" src="https://youtube.com/embed/$1"></iframe>',  $clean);
    echo $clean;

注: 「?」ワイルドカード(.*?)ではすべてが壊れていたので、に変更しました(.*)

編集これはまだ機能しません。html を壊し、置換後のコンテンツをブロックしています。

于 2013-06-11T01:22:27.357 に答える