3

数字を含む単語 (参照) または小さな単語 (2 文字以下) を製品名から削除したいのですが、適切な正規表現が見つかりません。

いくつかの例:

  • 「チェーン反り防止 ECS-2035」は「チェーン反り防止」にすべき
  • 「Guide 35 cm Oregon Intenz」は「Guide Oregon Intenz」になります。
  • 「Tronçonneuse sans fil AKE 30 LI - Guide 30 cm 36 V」は「Tronçonneuse sans fil AKE - Guide」になります。

私はPHPでこれをやっています:

preg_replace('#([^A-Za-z-]+)#', ' ',' '.wd_remove_accents($modele).' ');
4

5 に答える 5

4

知っている RegExp ですべてを行う必要はありません。

<?php

$str = "Chaine anti-rebond ECS-2035 cm 30 v";
$result = array();

$split = explode(" ", $str); //Split to an array

foreach ($split as $word) {
    if ((strlen($word) <= 2) || (preg_match("|\d|", $word))) {  //If word is <= 2 char long, or contains a digit
        continue;                                               //Continue to next iteration immediately 
    }
    $result[] = $word;                                          //Add word to result array (would only happen if the above condition was false)
}

$result = implode(" ", $result);                                //Implode result back to string

echo $result;

単語ベースの文字列操作の場合、文字列自体を解析し、単語ベースで必要なものを正確に調整することは、多くの場合、文字列レベルの RegExp よりもはるかに優れています。

于 2012-04-25T12:35:43.660 に答える
2

のような Unicode 文字を処理するには、tronçonneuse次を使用できます。

/\b(?:[\pL-]+\pN+|\pN+[\pL-]+|\pN+|\pL{1,2})\b/

where\pLは任意の文字を\pN表し、任意の数字を表します。

于 2012-04-25T12:43:06.057 に答える
0

あなたの要件は最終的な答えのために十分に具体的ではありませんが、これはあなたの例のためにそれをします:

$subject = 'Tronçonneuse sans fil AKE 30 LI - Guide 30 cm 36 V';
$regex = '/(\\s+\\w{1,2}(?=\\W+))|(\\s+[a-zA-Z0-9_-]+\\d+)/';
$result = preg_replace($regex, '', $subject);
于 2012-04-25T12:45:39.497 に答える
0

さて、あなたの例の組み合わせでは、次の正規表現が実行されます。

/\b(?:[-A-Za-z]+[0-9]+|[0-9]+[-A-Za-z]+|\d{1,2}|[A-Za-z]{1,2})\b/

次に、一致を空の文字列に置き換えます。

aaa897bbbただし、 -aaa786876aaa(およびオプションのダッシュ) などの文字列は使用できません。何が必要なのかわかりません-正規表現を改良する前に、ルールをより詳細に指定する必要があります。

于 2012-04-25T12:35:22.660 に答える
-1

コールバック関数http://www.php.net/manual/en/function.preg-replace-callback.phpで preg_replace_callback とフィルターを使用します。

これは、3 つのテスト文字列すべてで機能します。

<?php

$str = "Tronçonneuse sans fil AKE 30 LI - Guide 30 cm 36 V";

function filter_cb($matches)
{
    $word = trim($matches[0]);

    if ($word !== '-' && (strlen($word) <= 2 || (preg_match("/\d/", $word)))) {
        return '';
    }

    return $matches[0];
}

$result = preg_replace_callback('/([\p{L}\p{N}-]+\s*)/u', "filter_cb", $str);

echo trim($result);
于 2012-04-25T12:31:58.707 に答える