2

コンテンツ内の URL を一致させるための簡単な正規表現に行き詰まっています。目標は、「/folder/id/123」などのリンクからフォルダーを削除し、それらを「id/123」に置き換えて、同じフォルダー内の短い相対的なものにすることです。

実際に私はした

$pattern = "/\/?(\w+)\/id\/(\d)/i"
$replacement = "id/$2";
return preg_replace($pattern, $replacement, $text);

そしてそれはうまくいくようです。

しかし、私がやりたい最後のテストは、同じパターン /folder/id/123 も使用する外部サイトである場合、一致する各 URL に http:// が含まれていないことをテストすることです。

/[^http://] または (?<!html)... とさまざまなことを試しましたが、成功しませんでした。どんな助けでもとてもいいでしょう:-)

    $pattern = "/(?<!http)\b\/?(\w+)\/id\/(\d)/i"; ???????

ありがとう !

ここにいくつかの例があります: ご協力ありがとうございます :-)

(these should be replaced, "same folder" => short relative path only)
<a href="/mysite_admin/id/414">label</a> ==> <a href="id/414">label</a>
<a href="/mYsITe_ADMIN/iD/29">label with UPPERCASE</a> ==> <a href="id/414">label with UPPERCASE</a>

(these should not be replaced, when there is http:// => external site, nothing to to)
<a href="http://mysite_admin/id/414">label</a> ==> <a href="http://mysite_admin/id/414">label</a>
<a href="http://www.google_admin.com">label</a> ==> <a href="http://www.google_admin.com">label</a>
<a href="http://anotherwebsite.com/id/32131">label</a> ==> <a href="http://anotherwebsite.com/id/32131">labelid/32131</a>
<a href="http://anotherwebsite_admin.com/id/32131">label</a> ==> <a href="http://anotherwebsite_admin.com/id/32131">label</a>
4

2 に答える 2

3

アサーション<をマークするために使用される は必要ありません。パターンとして使用するだけです。/foo/bar/123 には一致しますが、http://www.google.com/foo/bar/123には一致しません。look-back/^(?!http)\/?(\w+)\/node\/(\d)/i

この質問は、これに役立つ素晴らしい概要を提供します

于 2012-08-13T13:31:00.963 に答える
0

細かい PHP マニュアルから - Assertions :

明らかに類似したパターン (?!foo)bar は、「foo」以外の何かが前にある「bar」の出現を検出しないことに注意してください。次の 3 文字が「bar」である場合、アサーション (?!foo) は常に TRUE であるため、「bar」の出現を検出します。この効果を得るには、後読みアサーションが必要です。

そのような:

$pattern = "/(?<!http:\/)\/(\w+)\/id\/(\d)/i";
于 2014-04-08T13:30:23.887 に答える