我有一个$ text来剥离所有非字母数字字符,用单个空格替换多个空格和换行符,并消除开始和结束空格。
到目前为止,这是我的解决方案。
$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 */
是否可以在一个正则表达式中组合/实现所有这些?因为我会在下面的一行中得到所需的结果
$finalText = preg_replace(some_reg_expression, $replaceby, $text);
感谢
编辑:用测试字符串
澄清答案 0 :(得分:3)
当然可以。这很容易。
看起来像:
((?<= )\s*)|[^a-zA-Z0-9\s]|(\s*$)|(^\s*)
我手头没有PHP,我使用过Perl(只是为了测试它并显示它有效)(你可以使用我的代码here):
$ 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是什么?
((?<= )\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。
从讨论中更新:
$text ='some ? ! ? text';
时会发生什么?
然后结果字符串包含“some”和“text”之间的多个空格。
解决问题并不容易,因为需要具有可变长度的正向后向断言,而目前这是不可能的。一个人不能简单地检查空格,因为它可能发生,因此它不是空格而是非字母数字字符,无论如何它都将被移除(例如:在" !"
"!"
符号将被移除但是RE知道没有什么;一个人需要像(?<=[^a-zA-Z0-9\s]* )\s*
这样的东西,但不幸的是,因为PCRE不支持外观可变长度断言,所以不会有效。
答案 1 :(得分:1)
我认为你不能用一个正则表达式实现这一目标。你基本上需要坚持if else
条件,而单凭正则表达式是不可能的。
你基本上需要一个正则表达式来删除非字母数字数字,另一个用于折叠空格,这基本上就是你正在做的事情。
答案 2 :(得分:1)
检查这是否是您要找的---
$patterns = array ('/[^a-zA-Z0-9\s]/','/\s+/');
$replace = array ("", ' ');
trim( preg_replace($patterns, $replace, $text) );
可能需要一些修改,请告诉我这是否是您想做的事情?
答案 3 :(得分:0)
为了您自己的理智,您需要保留以后仍然可以理解和编辑的正则表达式:)
$text = preg_replace(array(
"/[^a-zA-Z0-9\s]/", // remove all non-space, non-alphanumeric characters
'/\s{2,}/', // replace multiple white space occurrences with single
), array(
'',
' ',
), trim($originalText));
答案 4 :(得分:0)
$text =~ s/([^a-zA-Z0-9\s].*?)//g;
不一定要比这更难。