Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP preg_replace";未知修饰语";_Php_Regex_Preg Replace - Fatal编程技术网

PHP preg_replace";未知修饰语";

PHP preg_replace";未知修饰语";,php,regex,preg-replace,Php,Regex,Preg Replace,我试图在PHP中使用正则表达式数组在字符串中查找和替换,但是得到了错误unknown修饰符。我知道这似乎是一个流行的问题,但是我不知道如何在我的场景中修复它 以下是我最初的正则表达式模式: {youtube((?!}).)*} 我对其运行以下代码以转义任何字符: $pattern = '/' . preg_quote($pattern) . '/'; 返回以下内容: /\{youtube\(\(\?\!\}\)\.\)\*\}/ 但是,当我通过preg\u replace运行此模式时,会出

我试图在PHP中使用正则表达式数组在字符串中查找和替换,但是得到了错误
unknown修饰符
。我知道这似乎是一个流行的问题,但是我不知道如何在我的场景中修复它

以下是我最初的正则表达式模式:

{youtube((?!}).)*}
我对其运行以下代码以转义任何字符:

$pattern = '/' . preg_quote($pattern) . '/';
返回以下内容:

/\{youtube\(\(\?\!\}\)\.\)\*\}/
但是,当我通过
preg\u 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);

这里有一个

简单地将Regex分隔符更改为模式中未使用的内容,在本例中,我使用了运行良好的
@

preg_quote
仅转义
\+*?[ ^ ] $ ( ) { } = ! < > | : -,因此,当在模式中使用非转义字符,但也将其用作正则表达式分隔符时,它将无法按预期工作。如上所述更改分隔符,或将其作为


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

$find[$key] = '/' . preg_quote ($value, '/') . '/';
{youtube something="maybe"}http://...{/youtube}

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

我可能坐在医院候诊室里,远离计算机,但您所做的似乎使问题变得复杂

如果我想正确理解这一点,您希望替换如下一些:

$find[$key] = '/' . preg_quote ($value, '/') . '/';
{youtube something="maybe"}http://...{/youtube}
与:

没有

如果是这种情况,那么解决方案非常简单,大致如下:

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

重要的注意事项是保留标记的打开/关闭状态,并将正则表达式包装在与目标字符串(在本例中为哈希)不太冲突的内容中。

No,为什么要使用
preg\u quote
。它的意思是用于文本字符串部分,但是你已经有了一个正则表达式模式。马里奥,我想他们试图用这种方式来分离原因。它仍然抛出奇怪的错误这一事实本身就很有趣。@mario我正在使用
preg\u quote
来解决以前的一个问题。。。但即使没有它,我也会得到同样的错误。请发布您正在运行的实际代码。因为我没有得到
preg\u match(“/\{youtube\(\(\?\!\)\。\)\*\/”,“)的确切错误或者,实际模式和转义模式都没有任何错误。那么,毕竟是这样:嗨,鲁迪,好久不说话了。。。最近怎么样?感谢您(和@mario)指出这个问题,因为
preg\u quote
它无法进行替换,但是删除它现在可以了。选择不在模式中的分隔符并不总是容易的,尤其是在运行时计算模式时。更好的方法是使用标准分隔符
“/”
,并将其作为第二个参数传递给
preg\u quote
,这样
preg\u quote
会将其与其他特殊字符一起引用。代码示例见我的答案。@ilmv-情况很好,你的情况如何?您应该给我发电子邮件,并与我联系:D@MikhailVladimirov它不是在运行时计算的,我还提到使用另一个重载。preg_replace_all可能是确保捕获所有标记而不是只捕获第一个标记所必需的。