0

PHPで文字列内を検索して置換するために正規表現の配列を使用しようとしていますが、エラーが発生しますunknown modifier。これが一般的な問題のように見えることは承知していますが、シナリオで修正する方法がわかりません。

これが私の元の正規表現パターンです:

{youtube((?!}).)*}

次のコードを実行して、文字をエスケープします。

$pattern = '/' . preg_quote($pattern) . '/';

これにより、次のようになります。

/\{youtube\(\(\?\!\}\)\.\)\*\}/

ただし、このパターンを実行するpreg_replaceと、次のエラーが発生します。

Warning: preg_replace() [function.preg-replace]: Unknown modifier 'y' ...

何を変更する必要があるのか​​、そしてここに示したコードのどの段階で何か考えはありますか?

どうもありがとう

編集1

要求に応じて、これが私が使用しているコードです:

$content = "{youtube}omg{/youtube}";
$find = array();
$replace = array();

$find[] = '{youtube((?!}).)*}';
$replace[] = '[embed]http://www.youtube.com/watch?v=';
$find[] = '{/youtube((?!}).)*}';
$replace[] = '[/embed]';

foreach ( $find as $key => $value ) {
    $find[$key] = '/' . preg_quote($value) . '/';
}

echo preg_replace($find, $replace, $content);

これが実際の例です

4

3 に答える 3

1

preg_quote次のように、2番目のパラメータとして区切り文字を渡す必要があります。

$find[$key] = '/' . preg_quote ($value, '/') . '/';

そうしないと、区切り文字が引用されないため、問題が発生します。

于 2013-03-13T13:11:40.103 に答える
0

正規表現の区切り文字をパターンで使用されていないものに変更するだけです。この例では、@正常に機能するものを使用しました。

preg_quoteエスケープするだけ. \ + * ? [ ^ ] $ ( ) { } = ! < > | : -なので、パターンでエスケープされていない文字を使用する場合だけでなく、正規表現の区切り文字としても使用すると、期待どおりに機能しません。上記のように区切り文字を変更するか、オーバーロードpreg_quoteの一部として明示的に区切り文字を渡します。preg_quote($str, $delimiter)

$content = "{youtube}omg{/youtube}";
$find = array();
$replace = array();

$find[] = '{youtube((?!}).)*}';
$replace[] = '[embed]http://www.youtube.com/watch?v=';
$find[] = '{/youtube((?!}).)*}';
$replace[] = '[/embed]';

foreach ( $find as $key => $value ) {
    $find[$key] = '@' . preg_quote($value) . '@';
}

echo preg_replace($find, $replace, $content);
于 2013-03-13T13:08:40.447 に答える
0

私はコンピューターから離れた病院の待合室に座っているかもしれませんが、あなたがしていることは問題をはるかに複雑にしているようです。

私がこれを正しく理解するためには、次のようなものを置き換えたいと思います。

{youtube something="maybe"}http://...{/youtube}

と:

[embed]http://...[/embed]

いいえ?

その場合、解決策は次のような単純なものです。

preg_replace('#{(/?)youtube[^}]*}#', '[\1embed]', $content);

重要な考慮事項は、タグの開閉性を維持することと、ターゲット文字列(この場合はハッシュ)とあまり競合しないもので正規表現をラップすることです。

于 2013-03-13T13:22:50.003 に答える