我想执行不区分大小写的子字符串第一次外观替换。
我试过这段代码:
$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
的第一个外观?
答案 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()
正是您要找的。 p>
虽然
. \ + * ? [ ^ ] $ ( ) { } = ! < > | : -
是模式中的特殊字符,您必须先将它们转义(A + k变为A \ + k)。
修改:Example here。
答案 2 :(得分:0)
+
有特殊的方法,你应该逃避它。
答案 3 :(得分:0)
实际上,这可以在没有任何正则表达式的情况下解决。有一个有用的函数strtr。所以,你可以这样使用它:
$product_name_no_manufacturer
= strtr( $product_manufacturer, array( $product_name => '' ) );
这比regexp更快,我觉得更方便。