ventana página pagina otra misma link hipervinculo hacer etiqueta enlaces enlace ejemplos dentro como abrir php html dom

php - página - hipervinculo html



Agarrando el atributo href de un elemento A (9)

Intentando encontrar los enlaces en una página.

mi expresión regular es:

/<a/s[^>]*href=(/"/'??)([^/"/' >]*?)[^>]*>(.*)<//a>/

pero parece fallar en

<a title="this" href="that">what?</a>

¿Cómo cambiaría mi expresión regular para tratar con href que no se colocó primero en la etiqueta a?


El patrón que desea buscar sería el patrón de enlace de enlace, como (algo):

$regex_pattern = "/<a href=/"(.*)/">(.*)<//a>/";


Estoy de acuerdo con Gordon, DEBES usar un analizador HTML para analizar HTML. Pero si realmente quieres una expresión regular, puedes probar esta:

/^<a.*?href=(["/'])(.*?)/1.*$/

Esto coincide con <a a al comienzo de la cadena, seguido de cualquier cantidad de caracteres (no codiciosos) .*? luego href= seguido por el enlace rodeado por " o ''

$str = ''<a title="this" href="that">what?</a>''; preg_match(''/^<a.*?href=(["/'])(.*?)/1.*$/'', $str, $m); var_dump($m);

Salida:

array(3) { [0]=> string(37) "<a title="this" href="that">what?</a>" [1]=> string(1) """ [2]=> string(4) "that" }


No estoy seguro de lo que estás tratando de hacer aquí, pero si estás tratando de validar el enlace, mira el filtro de PHP ()

Si realmente necesita usar una expresión regular, entonces revise esta herramienta, puede ayudar: http://regex.larsolavtorvik.com/


Para el que aún no obtiene las soluciones de manera fácil y rápida usando SimpleXML

$a = new SimpleXMLElement(''<a href="www.something.com">Click here</a>''); echo $a[''href'']; // will echo www.something.com

Funciona para mí


Prueba rápida: <a/s+[^>]*href=(/"/'??)([^/1]+)(?:/1)>(.*)<//a> parece hacer el truco, con el 1er partido siendo "o", el segundo el "href" valor "eso", y el tercero el "¿qué?".

El motivo por el que dejé la primera coincidencia de "/" es que puede usarlo para hacer una referencia posterior más tarde para el cierre "/", de modo que es lo mismo.

Ver ejemplo en vivo en: http://www.rubular.com/r/jsKyK2b6do


Usando su expresión regular, la modifiqué un poco para adaptarla a sus necesidades.

<a.*?href=("|'')(.*?)("|'').*?>(.*)<//a>

Yo personalmente sugiero que uses un analizador HTML

EDITAR: Probado


por qué no coincides

"<a.*?href/s*=/s*[''"](.*?)[''"]" <?php $str = ''<a title="this" href="that">what?</a>''; $res = array(); preg_match_all("/<a.*?href/s*=/s*[''/"](.*?)[''/"]/", $str, $res); var_dump($res); ?>

entonces

$ php test.php array(2) { [0]=> array(1) { [0]=> string(27) "<a title="this" href="that"" } [1]=> array(1) { [0]=> string(4) "that" } }

que funciona Acabo de quitar los primeros soportes de captura.


preg_match_all ("/ (] >) (. ?) (</ a) /", $ contents, $ impmatches, PREG_SET_ORDER);

Se prueba y recupera todas las etiquetas de cualquier código html.


Reliable Regex para HTML es difícil . Aquí es cómo hacerlo con DOM :

$dom = new DOMDocument; $dom->loadHTML($html); foreach ($dom->getElementsByTagName(''a'') as $node) { echo $dom->saveHtml($node), PHP_EOL; }

Lo anterior encontraría y "outerHTML" el "outerHTML" de todos los elementos A en la cadena $html .

Para obtener todos los valores de texto del nodo, lo haces

echo $node->nodeValue;

Para verificar si existe el atributo href , puede hacer

echo $node->hasAttribute( ''href'' );

Para obtener el atributo href harías

echo $node->getAttribute( ''href'' );

Para cambiar el atributo href harías

$node->setAttribute(''href'', ''something else'');

Para eliminar el atributo href harías

$node->removeAttribute(''href'');

También puede consultar el atributo href directamente con XPath

$dom = new DOMDocument; $dom->loadHTML($html); $xpath = new DOMXPath($dom); $nodes = $xpath->query(''//a/@href''); foreach($nodes as $href) { echo $href->nodeValue; // echo current attribute value $href->nodeValue = ''new value''; // set new attribute value $href->parentNode->removeAttribute(''href''); // remove attribute }

Ver también:

En una nota al margen: estoy seguro de que este es un duplicado y puedes encontrar la respuesta en algún lugar aquí