2

すべての異なるタイプのリンク (相対、絶対、ルート相対) を含む html を含むテキストの文字列があります。preg_replace他のリンクに触れることなく、すべての相対リンクをルート相対リンクに置き換えるためにPHP で実行できる正規表現が必要です。私はすでにルートパスを持っています。

置き換えられたリンク:

<tag ... href="path/to_file.ext" ... >   --->   <tag ... href="/basepath/path/to_file.ext" ... >
<tag ... href="path/to_file.ext" ... />   --->   <tag ... href="/basepath/path/to_file.ext" ... />

手つかずのリンク:

<tag ... href="/any/path" ... >
<tag ... href="/any/path" ... />
<tag ... href="protocol://domain.com/any/path" ... >
<tag ... href="protocol://domain.com/any/path" ... />
4

2 に答える 2

4

ベース URI を変更するだけの場合は、BASE要素を試すことができます。

<base href="/basepath/">

ただし、ベース URI を変更すると、相対 URI パスだけでなく、すべての相対 URI に影響することに注意してください。

それ以外の場合、本当に正規表現を使用したい場合は、必要な相対パスはpath-noscheme型でなければならないことを考慮してください ( RFC 3986を参照)。

path-noscheme = segment-nz-nc *( "/" segment )
segment       = *pchar
segment-nz-nc = 1*( unreserved / pct-encoded / sub-delims / "@" )
                ; non-zero-length segment without any colon ":"
pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
pct-encoded   = "%" HEXDIG HEXDIG
unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
sub-delims    = "!" / "$" / "&" / "'" / "(" / ")"
              / "*" / "+" / "," / ";" / "="

したがって、URI の先頭は一致する必要があります。

^([a-zA-Z0-9-._~!$&'()*+,;=@]|%[0-9a-fA-F]{2})+($|/)

ただし、HTML を解析してそこから DOM を構築するには、適切な HTML パーサーを使用してください。次に、DOM にクエリを実行してhref属性を取得し、上記の正規表現で値をテストできます。

于 2010-05-19T23:13:20.183 に答える
0

私はこれを思いついた:

preg_replace('#href=["\']([^/][^\':"]*)["\']#', $root_path.'$1', $html);

少し単純すぎるかもしれません。私が見た明らかな欠陥は、タグの外にある場合にも一致href="something"することですが、うまくいけば、開始することができます.

于 2010-05-19T23:01:27.107 に答える