1

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

我试过这段代码:

$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 灯 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

4 回答 4

2

preg_quote()就是你要找的。

尽管

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

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

编辑:这里的例子

于 2012-05-16T08:29:38.950 回答
2

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

$quoted = preg_quote($product_manufacturer, '/');
$product_name_no_manufacturer = preg_replace("/$quoted/i", "", $product_name, 1);
于 2012-05-16T08:28:49.117 回答
0

+在正则表达式中有特殊的手段,你应该逃避它。

于 2012-05-16T08:30:28.010 回答
0

Actually, this can be solved without any regular expressions. There is a useful function strtr. So, you can use it like that:

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

This will be more faster than regexp and I think more convenient.

于 2012-05-16T09:24:20.040 回答