7

少し深すぎる記事をいくつか見たので、それらの正規表現ステートメントから何を削除すればよいかわかりません。

私は基本的にこれを持っています

foo:barからanotherfoo:bar; seg98y34g。?sdebvw h segvu(何でもかまいません)

コロンの後のすべてを削除するには、PHP正規表現が必要です。最初の部分は任意の長さにすることができます(ただし、コロンが含まれることはありません。したがって、上記のどちらの場合も、最終的には次のようになります。

fooanotherfoo

この恐ろしい疑似コードの例のようなことをした後

$string = 'foo:bar';
$newstring = regex_to_remove_everything_after_":"($string);

編集

これを投稿した後、explode()十分に確実に動作しますか?何かのようなもの

$pieces = explode(':', 'foo:bar') 
$newstring = $pieces[0];
4

6 に答える 6

25

explodeあなたが求めていることをしますが、 を使用して 1 つのステップにすることができますcurrent

$beforeColon = current(explode(':', $string));

strposここでは正規表現を使用しません (これには、比較的単純なアクションのために舞台裏でいくつかの作業が含まれsubstrます)。最も重要なことは、これにより、コードを読んだ人がすぐに「ああ、そうです、それが作成者がやろうとしていることです!」ということです。「待って、また何が起こっているの?」の代わりに。

唯一の例外は、文字列が長すぎることがわかっている場合ですexplode。1 GB のファイルは必要ありません。その代わり:

$beforeColon = substr($string, 0, strpos($string,':'));

私はまたsubstr、読みにくいと感じています:current(explode余分な関数呼び出しなしで区切り文字をすぐに見ることができ、変数のインシデントは 1 つだけです (これにより、人的エラーが発生しにくくなります)。基本的にcurrent(explode、「この文字列より前の最初のインシデントを取得している」と読みますがsubstr、これは「0 の位置から始まり、この文字列まで続く部分文字列を取得しています」とは対照的です。

于 2012-10-02T19:37:35.410 に答える
9

あなたのexplodeソリューションはそのトリックを行います。何らかの理由で本当に正規表現を使用したい場合は、次のように簡単に実行できます。

$newstring = preg_replace("/(.*?):(.*)/", "$1", $string);
于 2012-10-02T19:35:38.597 に答える
3

m.buettner が書いた RegEx を使用できますが、彼の例では「:」より前のすべてが返されます。「:」より後のすべてが必要な場合は、$1 の代わりに $2 を使用してください。

$newstring = preg_replace("/(.*?):(.*)/", "$2", $string);
于 2014-03-05T15:50:21.037 に答える
3

他の例よりも少し簡潔です。

current(explode(':', $string));
于 2012-10-02T19:37:32.630 に答える
0

次のようなものを使用できます。デモ: http://codepad.org/bUXKN4el

<?php 
  $s = 'anotherfoo:bar;seg98y34g.?sdebvw h segvu';
  $result = array_shift(explode(':', $s));
  echo $result;
?>
于 2012-10-02T19:35:56.173 に答える
-1

なぜ正規表現を使いたいのですか?

list($beforeColon) = explode(':', $string);
于 2012-10-02T19:36:26.157 に答える