1

文字列の先頭にあるすべての一致する出現を置き換えたい。これがユースケースです。 www.example.com/example.com/http://example.com/www.abc.com/www.example.com/xyz.com/example.com なるべき www.abc.com/www.example.com/xyz.com/example.com

一致しない文字列が出現するまで、すべての一致する出現を削除する必要があります。

私はpreg_replace現在この正規表現を使用しています

'/(http:\/\/){0,1}(www.){0,1}example.com(\/)*/i' 問題は、一致するすべての文字列を置き換えることです。

一致した文字列を最初にのみ置き換えたいのですが、その後一度一致が失敗した場合、何も置き換えてはなりません。役立つ提案はありますか?

ありがとう。

4

4 に答える 4

3

アンカーを使用して^、文字列の先頭でのみ一致するようにします。

'/^(http:\/\/){0,1}(www.){0,1}example.com(\/)*/i'

アンカーの詳細については、この正規表現チュートリアルをご覧ください。

注:正規表現で?は、 は と同じ{0,1}です。

于 2013-06-20T19:30:33.580 に答える
1

preg_replace の代わりに文字列をキャプチャすることもできます。

(?:(?:www.|http::?\/\/)?example\.com\/)+(.*)

唯一のキャプチャ グループには、探している文字列が含まれています。ここを参照してください。

http::また、入力文字列に含まれていることに気付きました。正規表現でも同じですが、念のため一致させました?。そして最後に、{0,1}と書くかもしれません?。短いです:)

PHPコード(私は言語にあまり詳しくありませんが、これでうまくいくと思います):

preg_match('/(?:(?:www.|http::?\/\/)?example\.com\/)+(.*)/', $html, $matches);
$url = $matches[1];
于 2013-06-20T19:34:00.507 に答える
0

まず、PHP 正規表現エンジンを使用すると、別の正規表現区切り文字を使用できます。~そのため、代わりにorを使用#してスラッシュのエスケープを無効にすることができます。また、特殊な正規表現文字であるため、ドットをエスケープする必要があります。

リファクタリングされた正規表現は次のようになります。

'~(?:https?://)?(?:www\.)?example\.com/~i'

完全な PHP コード:

$regex_replace = '~(?:https?://)?(?:www\.)?example\.com/(?!$)~i';
$string = "www.example.com/example.com/http://example.com/www.abc.com/xyz.com/example.com/";
$after = preg_replace($regex_replace, '', $string);
var_dump($after);

出力:

string(32) "www.abc.com/xyz.com/example.com/"
于 2013-06-20T19:40:24.260 に答える
-1

(この例では 3 番目の引数)の$limitパラメーターを使用します。preg_replace

preg_replace('/(http:\/\/){0,1}(www.){0,1}example.com(\/)*/i', $replacement, $subject, 1);
于 2013-06-20T19:30:53.673 に答える