首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Regex:一起删除非字母数字字符、多个空格和trim()

Regex:一起删除非字母数字字符、多个空格和trim()
EN

Stack Overflow用户
提问于 2012-06-20 14:53:47
回答 5查看 2.7K关注 0票数 4

我有一个$text,可以去掉所有非字母数字字符,用单个空格替换多个空格和换行符,并消除开始和结束空格。

到目前为止,这是我的解决方案。

代码语言:javascript
复制
$text = '
some-    text!! 

for testing?
'; // $text to format

//strip off all non-alphanumeric chars
$text = preg_replace("/[^a-zA-Z0-9\s]/", "", $text);

//Replace multiple white spaces by single space 
$text = preg_replace('/\s+/', ' ', $text);

//eliminate beginning and ending space
$finalText = trim($text);
/* result: $finalText ="some text for testing";
without non-alphanumeric chars, newline, extra spaces and trim()med */

有没有可能在一个正则表达式中组合/实现所有这些?因为我只需要一行代码就可以得到想要的结果,如下所示

代码语言:javascript
复制
$finalText = preg_replace(some_reg_expression, $replaceby, $text);

谢谢

编辑:使用测试字符串进行澄清

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-06-20 15:16:58

你当然可以。这很简单。

re将如下所示:

代码语言:javascript
复制
((?<= )\s*)|[^a-zA-Z0-9\s]|(\s*$)|(^\s*)

我手头没有PHP,我使用了Perl (只是为了测试re并展示它的工作)(你可以使用我的代码here):

代码语言:javascript
复制
$ cat test.txt 
         a       b       c    d
a b c e f g             fff  f

$ cat 1.pl 
while(<>) {
    s/((?<= )\s*)|[^a-zA-Z0-9\s]|(\s*$)|(^\s*)//g;
    print $_,"\n";
}

$ cat test.txt | perl 1.pl 
a b c d
a b c e f g fff f

对于PHP,它将是相同的。

RE的作用是什么?

代码语言:javascript
复制
((?<= )\s*)       # all spaces that have at least one space before them
|
[^a-zA-Z0-9\s]    # all non-alphanumeric characters
|
(\s*$)            # all spaces at the end of string
|
(^\s*)            # all spaces at the beginning of string

这里唯一棘手的部分是((?<= )\s*),lookbehind断言。当且仅当空格的子字符串之前有空格时,才能删除空格。

当你想知道前视/后视断言是如何工作的,请看一下http://www.regular-expressions.info/lookaround.html

来自discussion的更新

当使用$text ='some ? ! ? text';时会发生什么?则生成的字符串在"some“和"text”之间包含多个空格。

要解决这个问题并不容易,因为人们需要可变长度的正向回溯断言,而这在目前是不可能的。人们不能简单地检查空格,因为它可能发生,所以它不是空格而是非字母数字字符,并且无论如何都会被移除(例如:在" !"中,"!"符号将被移除,但RE对此一无所知;一个人需要类似(?<=[^a-zA-Z0-9\s]* )\s*的东西,但不幸的是,这将不起作用,因为不支持lookbehind可变长度断言。

票数 3
EN

Stack Overflow用户

发布于 2012-06-20 15:01:54

我不认为您可以用一个正则表达式来实现这一点。您基本上需要固定在if else条件中,仅通过正则表达式是不可能的。

您基本上需要一个regex来删除非字母数字,另一个regex来折叠空格,这基本上就是您已经在做的事情。

票数 1
EN

Stack Overflow用户

发布于 2012-06-20 15:05:08

如果这就是你要找的-请勾选此项

代码语言:javascript
复制
$patterns = array ('/[^a-zA-Z0-9\s]/','/\s+/');
$replace = array ("", ' ');
trim( preg_replace($patterns, $replace, $text) );

MAy它可能需要一些修改,如果这是你想做的事情,请让我知道??

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11114307

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档