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í