正则表达式用根相对链接替换相对链接

发布于 2024-09-02 12:36:12 字数 638 浏览 4 评论 0原文

我有一串文本,其中包含带有所有不同类型链接(相对、绝对、根相对)的 html。我需要一个可以由 PHP 的 preg_replace 执行的正则表达式,以将所有相对链接替换为根相对链接,而不触及任何其他链接。我已经有了根路径。

替换的链接:

<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" ... />

I have a string of text that contains html with all different types of links (relative, absolute, root-relative). I need a regex that can be executed by PHP's preg_replace to replace all relative links with root-relative links, without touching any of the other links. I have the root path already.

Replaced links:

<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" ... />

Untouched links:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

舞袖。长 2024-09-09 12:36:12

如果您只想更改基本 URI,可以尝试 BASE 元素

<base href="/basepath/">

但请注意,更改基本 URI 会影响所有相对 URI,而不仅仅是相对 URI 路径。

否则,如果您确实想使用正则表达式,请考虑您想要的相对路径必须是 path-noscheme 类型(请参阅 RFC 3986):

路径-noscheme = 段-nz-nc *(“/”段)
段 = *pchar
段 nz-nc = 1*( 未保留 / pct 编码 / 子分隔符 / "@" )
                ;不带任何冒号“:”的非零长度段
pchar = 未保留 / pct 编码 / 子分隔符 / ":" / "@"
pct 编码 = "%" HEXDIG HEXDIG
未保留=字母/数字/“-”/“。” /“_”/“~”
子分隔符=“!” /“$”/“&” /“'”/“(”/“)”
              /“*”/“+”/“,”/“;” /“=”

因此 URI 的开头必须匹配:

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

但是请使用正确的 HTML 解析器来解析 HTML 并从中构建 DOM。然后您可以查询 DOM 以获取 href 属性并使用上面的正则表达式测试该值。

If you just want to change the base URI, you can try the BASE element:

<base href="/basepath/">

But note that changing the base URI affects all relative URIs and not just relative URI paths.

Otherwise, if you really want to use regular expression, consider that a relative path like you want must be of the type path-noscheme (see 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    = "!" / "
quot; / "&" / "'" / "(" / ")"
              / "*" / "+" / "," / ";" / "="

So the begin of the URI must match:

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

But please use a proper HTML parser for parsing the HTML an build a DOM out of that. Then you can query the DOM to get the href attributes and test the value with the regular expression above.

§对你不离不弃 2024-09-09 12:36:12

我想出了这个:

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

这可能有点太简单了。我看到的明显缺陷是,当它位于标签之外时,它也会匹配 href="something" ,但希望它可以帮助您入门。

I came up with this:

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

It might be a little too simplistic. The obvious flaw I see is that it will also match href="something" when it is outside of a tag, but hopefully it can get you started.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文