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.