Regex для замены относительной ссылки на корневую относительную ссылку - PullRequest
1 голос
/ 20 мая 2010

У меня есть текстовая строка, содержащая 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" ... />

Ответы [ 2 ]

4 голосов
/ 20 мая 2010

Если вы просто хотите изменить базовый 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 для анализа HTML и построения DOM из этого. Затем вы можете запросить DOM, чтобы получить атрибуты href и проверить значение с помощью приведенного выше регулярного выражения.

0 голосов
/ 20 мая 2010

Я придумал это:

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

Это может быть слишком упрощенно. Я вижу очевидный недостаток в том, что он также будет соответствовать href="something", когда он находится за пределами тега, но, надеюсь, он поможет вам начать.

...