obtener full __file__ php regex hyperlink relative-path absolute-path

full - php get relative path



Regex para reemplazar el enlace relativo con el enlace relativo raĆ­z (2)

Tengo una cadena de texto que contiene html con todos los tipos diferentes de enlaces (relativo, absoluto, relativo a la raíz). Necesito una expresión regular que pueda ser ejecutada por el preg_replace de PHP para reemplazar todos los enlaces relativos con enlaces relativos a la raíz, sin tocar ninguno de los otros enlaces. Ya tengo el camino de la raíz.

Enlaces reemplazados:

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

Enlaces intactos:

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


Se me ocurrió esto:

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

Puede ser un poco demasiado simplista. El defecto obvio que veo es que también coincidirá con href="something" cuando está fuera de una etiqueta, pero espero que pueda comenzar.


Si solo desea cambiar el URI base, puede probar el elemento BASE :

<base href="/basepath/">

Pero tenga en cuenta que cambiar el URI base afecta a todos los URI relativos y no solo a las rutas URI relativas.

De lo contrario, si realmente desea usar expresiones regulares, considere que una ruta relativa como la que desea debe ser del tipo path-noscheme (vea 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 = "!" / "$" / "&" / "''" / "(" / ")" / "*" / "+" / "," / ";" / "="

Por lo tanto, el comienzo del URI debe coincidir:

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

Pero utilice un analizador de HTML adecuado para analizar el HTML y compilar un DOM a partir de eso. Luego puede consultar el DOM para obtener los atributos href y probar el valor con la expresión regular anterior.