2012-04-25 21 views
3

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

いくつかの例:

  • "CHAINE抗再ボンディングECS-2035" "CHAINE抗再ボンディング"
  • "ガイド35センチメートルオレゴンIntenz" になるべきでは"ガイドオレゴンIntenz" になるべき
  • "TronçonneuseサンセリフFIL AKE 30 LI - ガイド30センチメートル36 Vは" "TronçonneuseサンセリフFIL AKE - ガイド" になるべき

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

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

thatsの理由を「数字(参照)ま​​たは小さな言葉(LTE 2文字)で単語を削除します」 – Aleski

+0

数字で文字列を検索するために完全一致の関数を指定しない限り、このようにすることはできません。例えばcm、li、V、ecsなどを提供する必要があります –

答えて

-1
コールバック関数で

使用preg_replace_callbackとフィルタhttp://www.php.net/manual/en/function.preg-replace-callback.php

をこれは、すべての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); 
0

まああなたの例では次の正規表現の組み合わせがあります:

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

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

ただし、aaa897bbbのような文字列は使用できません。aaa786または876aaa(およびオプションのダッシュ)。 私はそれがあなたが必要としているか分からない - 正規表現が洗練される前に、より詳細にルールを指定しなければならないだろう。あなたが知っている正規表現ですべてを行う必要はありません

4

:単語ベースの文字列操作のために

<?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

\pLは、任意の桁の任意の文字と \pNスタンドの略
/\b(?:[\pL-]+\pN+|\pN+[\pL-]+|\pN+|\pL{1,2})\b/ 

を:tronçonneuseにあなたが使用できるようにUnicode文字に対処するために

+0

はい - はい!文字列は正規表現のフィールドではありません! :) – gaussblurinc

+0

この文字列 'Chaine反rebond ECS-2035'の' ECS'は 'Chaine anti-rebond'になるはずです???????? –

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); 
関連する問題