我想将带有数字(参考)或小字(2个字符或更少)的单词删除到我的产品名称中,但我找不到好的正则表达式。
一些例子:
我在PHP中这样做:
preg_replace('#([^A-Za-z-]+)#', ' ',' '.wd_remove_accents($modele).' ');
答案 0 :(得分: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好得多。
答案 1 :(得分:2)
要处理tronçonneuse
中的unicode字符,您可以使用:
/\b(?:[\pL-]+\pN+|\pN+[\pL-]+|\pN+|\pL{1,2})\b/
其中\pL
代表任何字母,\pN
代表任何数字。
答案 2 :(得分:0)
嗯,对于您的示例中的组合,以下正则表达式将执行:
/\b(?:[-A-Za-z]+[0-9]+|[0-9]+[-A-Za-z]+|\d{1,2}|[A-Za-z]{1,2})\b/
然后用空字符串替换匹配。
但是,它不允许使用aaa897bbb
之类的字符串 - 仅aaa786
或876aaa
(以及可选的短划线)。
我不知道你需要什么 - 你需要在正则表达式改进之前更详细地指定规则。
答案 3 :(得分: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);
答案 4 :(得分:-1)
在回调函数http://www.php.net/manual/en/function.preg-replace-callback.php
中使用preg_replace_callback和filter这适用于所有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);