PHP preg_replace“未知修饰符”

时间:2013-03-13 12:46:58

标签: php regex preg-replace

我尝试使用正则表达式数组在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);

这里是live example

3 个答案:

答案 0 :(得分:1)

只需将您的正则表达式分隔符更改为模式中未使用的内容,在此示例中,我使用了@,它可以正常工作。

preg_quote只能转义. \ + * ? [ ^ ] $ ( ) { } = ! < > | : -,因此在您的模式中使用非转义字符时,也可以作为正则表达式分隔符时,它不会按预期工作。如上所述更改分隔符,或将preg_quote明确地作为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);

{{1}}

答案 1 :(得分:0)

您应该将分隔符作为preg_quote的第二个参数传递,如下所示:

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

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

答案 2 :(得分:0)

我可能会坐在远离电脑的医院候诊室里,但你正在做的事情似乎已经解决了这个问题。

如果我要正确理解这一点,你想要替换这样的:

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

使用:

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

没有

如果是这种情况,解决方案就像以下内容一样简单:

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

重要的考虑因素是保留标签的开放/封闭性,并将正则表达式包装在与目标字符串(在本例中为哈希)中没有太大冲突的东西中。