2012-04-25 5 views
3

Я хотел бы удалить слова с номерами (ссылки) или небольшие слова (2 символа или меньше) в мое имя продукта, но я не могу найти хорошее регулярное выражение.Regex для удаления слов с номерами

Некоторые примеры:

  • "Chaine анти-Rebond ECS-2035" должен стать "Chaine анти-Rebond"
  • "Руководство по 35 см Орегон Intenz" должен стать "Руководство Oregon Intenz"
  • "Tronçonneuse SANS FIL AKE 30 LI - Руководство по 30 см 36 V" должен стать "Tronçonneuse SANS FIL AKE - Руководство"

Я делаю это в PHP:

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

«удалить слова с цифрами (ссылка) или малыми словами (Г 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

Вам не нужно делать все, что в 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.

+0

да-да! string - это не поле для регулярных выражений! :) – gaussblurinc

+0

то как насчет 'ECS' в этой строке' Chaine anti-rebond ECS-2035' должен стать 'Chaine anti-rebond' ???????? –

2

Чтобы справиться с Юникода как в tronçonneuse вы можете использовать:

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

где \pL обозначает любую букву и \pN обозначает любую цифру.

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); 
Смежные вопросы