7

我需要一个正则表达式来从字符串中删除所有单个字符,而不仅仅是单个字母或数字

字符串是:

“未来英尺赌场空手道印章(地铁产品)”

它应该是:

“未来的 Ft 赌场空手道印章由 Metro”

我目前使用的表达式(在 PHP 中)正确地删除了单个 'A' 但留下了单个 '(' 和 ')'

这是我正在使用的代码:

$string = preg_replace('/\b\w\b\s?/', '', $string); 
4

2 回答 2

14

尝试这个:

(^| ).( |$)

分解:

   1.  (^| )  ->  Beginning of line or space  
   2.  .      ->  Any character  
   3.  ( |$)  ->  Space or End of line

实际代码:

$string = preg_replace('/(^| ).( |$)/', '$1', $string); 

注意:我不熟悉 PHP 正则表达式的工作原理,因此代码可能需要稍作调整,具体取决于实际正则表达式的声明方式。

正如 m.buettner 指出的那样,此代码将有一个尾随空格。需要修剪才能清除它。

编辑:Arnis Juraga 指出这不会清除多个单个字符a b c会过滤到b. 如果这是一个问题,请使用此正则表达式:

(^| ).(( ).)*( |$)

添加到中间的(( ).)*将查找任何字符 0 次或更多次后跟的任何空格。不利的一面是,这将在一系列单个字符所在的位置出现双空格。

这意味着:

The a b c dog

会变成这样:

The  dog

执行替换以获取单个字符后,您需要使用以下正则表达式来定位双空格,然后替换为单个空格

( ){2}
于 2012-11-08T23:59:39.703 回答
6

不需要捕获的稍微更有效的版本将使用环视。由于多重否定逻辑,它不太直观:

$string = preg_replace('/(?<!\S).(?!\S)\s*/', '', $input);

这将删除任何前面后面都没有非空白字符的字符因此只有那些在空白之间或字符串边界处的字符)。它还将包括匹配中的所有尾随空格,以便只留下前面的空格(如果有的话)。需要注意的是,就像尼克的回答一样,在字符串的末尾会留下一个尾随空格(因为它在字符前面)。这可以通过ming 字符串轻松解决。)trim

于 2012-11-09T00:11:57.000 回答