不区分大小写的子串首先在PHP中替换外观

时间:2012-05-16 08:25:36

标签: php regex preg-replace

我想执行不区分大小写的子字符串第一次外观替换。

我试过这段代码:

$product_name_no_manufacturer = preg_replace("/$product_manufacturer/i","",$product_name, 1);
$product_name_no_manufacturer = trim($product_name_no_manufacturer);

但在某些情况下不起作用。

何时 -

$product_name = "3M 3M LAMP 027";

$product_manufacturer = "3m";

我得到的结果是:

  

“3M LAMP 027”

但是当参数不同时 -

$product_name = "A+k A+k-SP-LAMP-027";

$product_manufacturer = "A+k";

我得到的结果是:

  

“A + k A + k-SP-LAMP-027”

为什么preg_replace不会替换A+k的第一个外观?

4 个答案:

答案 0 :(得分:2)

+是Regex中的一个特殊字符(“匹配前一个令牌一次或多次”),因此您必须将其转义。每当您在正则表达式中插入一个字符串时,请使用preg_quote()将其转义,因为它可能包含特殊字符(在这种情况下会导致看似奇怪的结果)。

$quoted = preg_quote($product_manufacturer, '/');
$product_name_no_manufacturer = preg_replace("/$quoted/i", "", $product_name, 1);

答案 1 :(得分:2)

preg_quote()正是您要找的。

虽然

. \ + * ? [ ^ ] $ ( ) { } = ! < > | : -

是模式中的特殊字符,您必须先将它们转义(A + k变为A \ + k)。

修改:Example here

答案 2 :(得分:0)

正则表达式中的

+有特殊的方法,你应该逃避它。

答案 3 :(得分:0)

实际上,这可以在没有任何正则表达式的情况下解决。有一个有用的函数strtr。所以,你可以这样使用它:

$product_name_no_manufacturer 
         = strtr( $product_manufacturer, array( $product_name => '' ) );

这比regexp更快,我觉得更方便。