正则表达式从字符串中删除单个字符

时间:2012-04-24 21:33:16

标签: php regex

考虑以下字符串

breaking out a of a simple prison
this is b moving up
following me is x times better

所有字符串都已小写。我想删除任何“松散”的a-z字符,导致:

breaking out of simple prison
this is moving up
following me is times better

这可以在php中使用单个正则表达式吗?

5 个答案:

答案 0 :(得分:3)

$str = "breaking out a of a simple prison
this is b moving up
following me is x times better";
$res = preg_replace("@\\b[a-z]\\b ?@i", "", $str);
echo $res;

答案 1 :(得分:1)

怎么样:

preg_replace('/(^|\s)[a-z](\s|$)/', '$1', $string);

注意,这也会捕获字符串开头或结尾的单个字符,但不会捕获与标点符号相邻的单个字符(它们必须用空格包围)。

如果你还想在标点符号之前删除字符(例如'x。'),那么这在大多数(英语)情况下都能正常工作:

preg_replace('/(^|\s)[a-z]\b/', '$1', $string);

答案 2 :(得分:1)

作为一个单行:

$result = preg_replace('/\s\p{Ll}\b|\b\p{Ll}\s/u', '', $subject);

匹配单个小写字母(\p{Ll}),前面或后面跟着空格(\s),同时删除两者。单词边界(\b)确保只有单个字母确实匹配。 /u修饰符使正则表达式识别Unicode。

结果:两边用空格包围的单个字母缩小为一个空格。一个前面有空格但没有后跟空格的单个字母将被完全删除,因为只有一个字母后面跟着但没有前面的空格。

所以

This a is my test sentence a. o How funny (what a coincidence a) this is!

更改为

This is my test sentence. How funny (what coincidence) this is!

答案 3 :(得分:0)

您可以尝试这样的事情:

preg_replace('/\b\S\s\b/', "", $subject);

这就是它的含义:

\b    # Assert position at a word boundary
\S    # Match a single character that is a “non-whitespace character”
\s    # Match a single character that is a “whitespace character” (spaces, tabs, and line breaks)
\b    # Assert position at a word boundary

<强>更新

Radu提出,因为我使用了\S,所以这不仅仅是a-zA-Z。它也会匹配0-9_。通常情况下,它会比那更匹配,但因为它前面有\b,所以它只能匹配单词字符。

正如Tim Pietzcker的评论中所提到的,请注意,如果您的主题字符串需要删除后跟非{8}等非字字符的单个字符,则无法使用此功能。如果像

这样的单个字符后面有额外的空格,它也会失败
test a (hello)

但您可以通过将表达式更改为test a hello

来解决此问题

答案 4 :(得分:0)

试试这个:

$sString = preg_replace("@\b[a-z]{1}\b@m", ' ', $sString);