考虑以下字符串
breaking out a of a simple prison
this is b moving up
following me is x times better
所有字符串都已小写。我想删除任何“松散”的 az 字符,结果是:
breaking out of simple prison
this is moving up
following me is times better
这可能在 php 中使用单个正则表达式吗?
$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;
怎么样:
preg_replace('/(^|\s)[a-z](\s|$)/', '$1', $string);
请注意,这也会捕获位于字符串开头或结尾的单个字符,但不会捕获与标点符号相邻的单个字符(它们必须被空格包围)。
如果您还想立即删除标点符号之前的字符(例如“x.”),那么这在大多数(英语)情况下应该可以正常工作:
preg_replace('/(^|\s)[a-z]\b/', '$1', $string);
你可以尝试这样的事情:
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
this will match more than just a-zA-Z
。它也会匹配0-9_
。通常,它会匹配更多,但因为它前面是\b
,它只能匹配单词字符。
正如Tim Pietzcker的评论中所提到的,请注意,如果您的主题字符串需要删除后跟非单词字符(如test a (hello)
. 如果像这样的单个字符后有多余的空格,它也会翻倒
test a hello
但您可以通过将表达式更改为\b\S\s*\b
作为一个单行:
$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!
试试这个:
$sString = preg_replace("@\b[a-z]{1}\b@m", ' ', $sString);