<?php
$text="1SD1700 thanks for anybody who help me out,djkfdj fdjkd 9-sjf  908-_/E626  ACS71/2  AT91M4080-0  CD7a4AC283  H1$0G  HG-3@02C  HW-10/5C";
while(preg_match('/(\s|,)+[^\d]+(\s|,)+/',$text,$matches)){
  $text=str_replace($matches[0],' ',$text);
}
while(preg_match('/(\s|,)+([^\s,]*[^\w\-\/\s,]+[^\s,]*)(\s|,)+/',$text,$matches)){
  $text=str_replace($matches[0],' ',$text);
}
echo $text;
?>

解决方案 »

  1.   

    yiwusuo:
     您的表达式太难懂了,有没有执行速度快点的?
      

  2.   

    先找出仅含有[A-Za-z0-9-_/]的词,再看词里有没有数字、字母,效率大概不高,不知道有没有更好的?
    <?php
    $result = '';
    $text = '1SD1700 thanks for anybody who help me out,djkfdj fdjkd 9-sjf 908-_/E626 ACS71/2 AT91M4080-0 CD7a4AC283 H1$0G HG-3@02C HW-10/5C';
    if (preg_match_all('([A-Za-z0-9-_/]+)',$text,$matches))
    {
     echo "<pre>";
     for ($i=0; $i< count($matches[0]); $i++) {
      if (preg_match('([0-9]+)',$matches[0][$i]) && preg_match('([A-Za-z]+)',$matches[0][$i]))
       $result .= $matches[0][$i]." ";
     }
    }
    echo $result;
      

  3.   

    deepbluesea(Jeff):
    您的代码基本可行,效率不高,根据我的特殊情况,该文本文件只有少量符合要求的,也就是能不能把您的代码改成这样的:先找出含有数字的字符串,然后再匹配是否含有字母,是否含有特殊字符,这样我想会快些。我根据您的代码改编一下,但是不成功,请大家指点一下。
    if (preg_match_all('([0-9]+)',$text,$matches))//找出含有数字的,也不知个规则对不对
    {
    echo "<pre>";
    for ($i=0; $i< count($matches[0]); $i++) {
    if (preg_match('([A-Za-z0-9-_/]+)',$matches[0][$i]) && preg_match('([A-Za-z]+)',$matches[0][$i]))//是否含有特殊字符,是否含有汉字
    $result .= $matches[0][$i]." ";
    }
    }
    echo $result;
    ?>
      

  4.   

    $s = "1SD1700 thanks for anybody who help me out,djkfdj fdjkd 9-sjf  908-_/E626  ACS71/2  AT91M4080-0  CD7a4AC283  H1$0G  HG-3@02C  HW-10/5C";preg_match_all('#(?:^|\s)[A-Za-z0-9-_/]*\d[A-Za-z0-9-_/]*(?:\s|$)#', $s, $r);
    echo join(' ', $r[0]);
      

  5.   

    xuzuning(唠叨)来了!
    我也是新手,这个正则也看不太明白,
    不过楼主要求包含数字、并且包含字母..
      

  6.   

    唠叨的结果是:
    1SD1700 9-sjf ACS71/2 CD7a4AC283 HW-10/5C
    这样丢了很多东西
    结果应该是 "1SD1700 9-sjf 908-_/E626 ACS71/2 AT91M4080-0 CD7a4AC283 HW-10/5C"
      

  7.   

    php5.0.2测试无误
    但 [A-Za-z0-9-_/] 本身是不符合正则约定的,应改为
    [-A-Za-z0-9_/]
    即出现在匹配列表中的“-”字符,应在列表开始或结束处
      

  8.   

    用strpos找位置算了,稳当些;这种规律性太差,不适合用正则。