0

すべてのテキスト行が Foo で始まるかどうかを PHP で確認するにはどうすればよいですか?

行の先頭にある「Foo」を削除したいのですが、すべての行が Foo で始まる場合に限ります。

$string = 'Foo A
Foo B
Foo C';

should return:
A
B
C

$string = 'Foo A
B
Foo C';

should return:
Foo A
B
Foo C

これはどのように一致させることができますか?

if ( preg_match("/^Foo/m", $string ) ) {
  $string = preg_replace('/^Foo /m', '', $string);
}

これは単一の行のみに一致しますが、前述のように、すべての行が「Foo」で始まる場合にのみ適用する必要があります。

テスト: http://codepad.viper-7.com/roZNEo

4

3 に答える 3

2

&$countのパラメーターを使用して、preg_replace発生した置換の数を判別します。それがテキストの行数と等しい場合、すべての行は。で始まりFooます。

function replace($text) {

    if ( preg_match("/^Foo/m", $text ) ) {
        $return = preg_replace('/^Foo /m', '', $text, -1, $num_matches); 
        if( $num_matches == count( explode( "\n", $text))) {
            $text = $return;
        }
    }

    return $text;
}

preg_match冗長で不要なため、への呼び出しを省略することもできます。

デモ

于 2012-06-07T17:10:16.160 に答える
1
<?php

$string = 'Foo A
Foo B
Foo C';

$a = explode("\n", $string);

foreach ($a as $line) {
  print preg_replace('/^Foo /', '', $line) . "\n";
}

?>

ここで動作を確認してください: http://codepad.org/ch6x0hSR

これは、このサンプル データにはやり過ぎであることに注意してください。str_replace()正規表現が本当に必要ない場合は、使用する必要があります。

各行が常にフォーマットされている{uselessword}{delimiter}{importantword}場合は、を使用することもできますexplode()

于 2012-06-07T17:11:19.867 に答える
1

すべての行が で始まることをアサートするために、正規表現を少し変更しました"Foo"

if ( preg_match("/^((?:^|\n)Foo.*)+$/", $text ) ) {
    $text = preg_replace('/^Foo /m', '', $text);
}

http://codepad.viper-7.com/ail50t

于 2012-06-07T17:13:36.223 に答える