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";

私が得る結果は次のとおりです:

「3MLAMP027」

しかし、パラメータが異なる場合-

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

$product_manufacturer = "A+k";

私が得る結果は次のとおりです:

「A+kA+k-SP-LAMP-027」

preg_replaceがの最初の外観を置き換えないのはなぜA+kですか?

4

4 に答える 4

2

+は正規表現の特殊文字(「前のトークンと1回以上一致する」)であるため、エスケープする必要があります。正規表現に文字列を挿入するときは常に、preg_quote()特殊文字を含めることができるため、。でエスケープしてください(この場合のように一見奇妙な結果になります)。

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

preg_quote()あなたが探しているものです。

けれど

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

パターン内の特殊文字である場合は、最初にそれらをエスケープする必要があります(A+kはA\+ kになります)。

編集:ここの例

于 2012-05-16T08:29:38.950 に答える
0

+正規表現には特別な手段があるので、それを回避する必要があります。

于 2012-05-16T08:30:28.010 に答える
0

実際、これは正規表現なしで解決できます。便利な関数strtrがあります。したがって、次のように使用できます。

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

これは正規表現よりも高速で、便利だと思います。

于 2012-05-16T09:24:20.040 に答える