我尝试使用正则表达式数组在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
答案 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);
重要的考虑因素是保留标签的开放/封闭性,并将正则表达式包装在与目标字符串(在本例中为哈希)中没有太大冲突的东西中。