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如下所示:

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

否则,分隔符将不会被引用,因此会导致问题。

于 2013-03-13T13:11:40.103 回答
0

Simply change your Regex delimiter to something that's not used in the pattern, in this example I used @ which works fine.

preg_quote only escapes . \ + * ? [ ^ ] $ ( ) { } = ! < > | : -, so when using a non-escaped character in your pattern, but also as your regex delimiter, it's not going to work as expected. Either change the delimiter as above, or pass it into preg_quote explicitely as part of the preg_quote($str, $delimiter) overload.

$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 回答