2016-02-11 12 views
7

私はこの長い間、この正規表現を取得しようとしています。次の文字列では、.com/<first_word>の後に続くすべてのスラッシュに一致することはありません。ただし、 の後には、URLがになります。Positive Lookbehindの後に特定の文字のすべてを一致させる

$string = "http://example.com/foo/12/jacket Input/Output"; 
    match------------------------^--^ 

スラッシュ間の単語の長さは関係ありません。

正規表現:(?<=.com\/\w)(\/)結果:

$string = "http://example.com/foo/12/jacket Input/Output"; // no match 
$string = "http://example.com/f/12/jacket Input/Output"; 
    matches--------------------^ 

正規表現:(?<=\/\w)(\/)結果:

$string = "http://example.com/foo/20/jacket Input/O/utput"; // misses the /'s in the URL 
    matches----------------------------------------^ 
$string = "http://example.com/f/2/jacket Input/O/utput"; // don't want the match between Input/Output 
    matches--------------------^-^--------------^      

後読みは何の修飾子を持っていないと私はちょうど持っている場合、私は疑問に思って長さゼロの表明である必要がありますすることができますので間違った経路をたどり、別の正規表現の組み合わせを探すべきです。

これを行うには、肯定的な視点が正しい方法ですか?それとも、私はコーヒーが大量ではないものを逃していますか?

NOTEは:正規表現がpreg_*機能のいずれかので動作するはずですのでPHPでタグ付けされました。

+2

The'preg_match'関数は、1個の一致を返します。あなたは、あるパターンの後にあるすべての文字に一致する必要があると言います。 'preg_match_all'を使うべきです。 –

+0

私はまだそれがXYの問題であるという印象を持っています。あなたは何を達成しようとしていますか?なぜそれらのスラッシュにマッチするのですか? URLをurl_parseしてから、何でもしてください。分解する。 –

+0

正規表現は 'preg_ *'関数の* any *で動作するはずなので、XY問題ではありません@WiktorStribiżew。 –

答えて

3

あなたがpreg_replaceを使用したい場合は、この正規表現は動作するはずです:

このように最初の後 |によって各 /を交換
$re = '~(?:^.*?\.com/|(?<!^)\G)[^/\h]*\K/~'; 
$str = "http://example.com/foo/12/jacket Input/Output"; 
echo preg_replace($re, '|', $str); 
//=> http://example.com/foo|12|jacket Input/Output 

.comの開始後に表示される/です。

(?<!^)は、/foo/bar/baz/abcdのように開始することなく文字列を置き換えることを避けるために必要です。.com

RegEx Demo

+0

この問題は、文字列の部分の '/'を 'Input/Output'に置き換えます –

+0

これは、* fooの後にスラッシュ*でなければなりませんが、URLにないものではありません。 –

+0

URLには、その他のデータ他のデータのスラッシュは影響を受けてはいけません。 –

3

ここで\K\G .grabのgroupsとともに使用してください。

^.*?\.com\/\w+\K|\G(\/)\w+\K 

デモを参照してください。

https://regex101.com/r/aT3kG2/6

$re = "/^.*?\\.com\\/\\w+\\K|\\G(\\/)\\w+\\K/m"; 
$str = "http://example.com/foo/12/jacket Input/Output"; 

preg_match_all($re, $str, $matches); 

Replace

$re = "/^.*?\\.com\\/\\w+\\K|\\G(\\/)\\w+\\K/m"; 
$str = "http://example.com/foo/12/jacket Input/Output"; 
$subst = "|"; 

$result = preg_replace($re, $subst, $str); 
+0

これは 'preg_match()'の文脈では動作しません。理由は何ですか? –

+0

OK - 'preg_match_all()'は動作しますが、他の 'preg ....'関数は 'preg_replace()'のように失敗します。 –

+0

@JayBlanchard交換の唯一の問題は、最後に1つの余分な交換が起こるということです。別に処理しなければならないと思います。 – vks

関連する問題