4

英数字以外の文字をすべて削除し、複数の空白と改行を単一のスペースに置き換え、開始スペースと終了スペースを削除する$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 */

これらすべてを1つの正規表現に組み合わせて実現することは可能ですか?以下のように1行で目的の結果が得られるため

$finalText = preg_replace(some_reg_expression, $replaceby, $text);

ありがとう

編集:テスト文字列で明確化

4

5 に答える 5

3

もちろんできます。それはとても簡単です。

reは次のようになります。

((?<= )\s*)|[^a-zA-Z0-9\s]|(\s*$)|(^\s*)

私は手元にPHPを持っていません、私はPerlを使用しました(reをテストしてそれが機能することを示すためだけに)(ここで私のコードで遊ぶことができます):

$ 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*)アサーションの背後にあるものです。スペースのサブストリングに前にスペースがある場合にのみ、スペースを削除します。

lookahead / lookbehindアサーションがどのように機能するかを知りたい場合は、http://www.regular-expressions.info/lookaround.htmlを参照してください。

ディスカッションからの更新

いつ何が起こり$text ='some ? ! ? text';ますか?次に、結果の文字列には、「some」と「text」の間に複数のスペースが含まれます。

この問題を解決するのはそれほど簡単ではありません。可変長の積極的な後読みアサーションが必要であり、現時点ではそれが不可能だからです。スペースではなく、英数字以外の文字であり、とにかく削除されるため、スペースを単純にチェックすることはできません(たとえば" !""!"記号では削除されますが、REは何も知りません。(?<=[^a-zA-Z0-9\s]* )\s*残念ながら、次のようなものが必要です。 PCREはルックビハインド可変長アサーションをサポートしていないため、機能しません。

于 2012-06-20T07:16:58.147 に答える
1

これがあなたが探しているものであるならば、これをチェックしてください---

$patterns = array ('/[^a-zA-Z0-9\s]/','/\s+/');
$replace = array ("", ' ');
trim( preg_replace($patterns, $replace, $text) );

変更が必要な場合がありますが、これがあなたのやりたいことかどうか教えてください。

于 2012-06-20T07:05:07.670 に答える
1

1つの正規表現でそれを達成できるとは思いません。if else基本的には、正規表現だけでは不可能な条件に固執する必要があります。

基本的に、英数字以外の数字を削除するための1つの正規表現と、スペースを折りたたむための別の正規表現が必要になります。これは、基本的にはすでに行っていることです。

于 2012-06-20T07:01:54.160 に答える
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));
于 2012-06-20T07:37:41.680 に答える
0
$text =~ s/([^a-zA-Z0-9\s].*?)//g;

これより難しい必要はありません。

于 2013-09-30T20:20:39.887 に答える