2012-09-19 46 views
1

的follwing代码给我一个错误 “的preg_replace()[function.preg替换]:未知的修饰词 '?'”preg_replace()[function.preg-replace]:未知修饰符'?'

$str = 'background: url("../../dsdgsd/contain.jpg");'; 

echo preg_replace('/url\s?\(\s?(\"|\')([../?]*[a-z/]*?[/?]?)([a-z0-9_-]*[.][jpg|jpeg|png|jpeg]*)([\'|\"]\))/gi','url("../images/$3")',$str); 
+0

你对[regex语法](http://us.php.net/manual/en/regexp.reference.delimiters.php)有多熟悉?要么使用模式本身不太可能发生的分隔符,例如'#',或者在模式中转义'/'的每个实例。 – DCoder

+2

编写这个正则表达式的人,混淆了'['和'('(除了各种其他问题)“,例如:'[../?]*''应该可以读为'(\\。\\ ./)*' ,即“多次出现'../'” – mvds

回答

2

我不知道这是什么正则表达式是应该做的,但给出的错误,因为你必须在模式/字符。解析器然后认为你的模式已经完成,并且将它后面的所有内容(在这种情况下为?)作为修饰符。因此错误。

修复使用另一种分离器:(大多数人使用#有很多的/打交道时)

echo preg_replace('#url\s?\(\s?(\"|\')([../?]*[a-z/]*?[/?]?)([a-z0-9_-]*[.][jpg|jpeg|png|jpeg]*)([\'|\"]\))#i','url("../images/$3")',$str); 

(从这个分开,如已经提到的,不需要g修改)

+0

感谢好友,它完美运作......“#”的概念真棒! –

1

由于您使用/字符开始正则表达式,因此它是一个分隔符,您应该在正则表达式中跳过所有出现的/。因为第二个/之后的第一个字符是?,所以它被解释为修饰符。

相关问题