考虑以下字符串
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中使用单个正则表达式吗?
答案 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);