Las expresiones regulares confiables para HTML son difíciles . A continuación se explica 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 buscaría y generaría el "HTML externo" de todos los A
elementos de la $html
cadena.
Para obtener todos los valores de texto del nodo, haz
echo $node->nodeValue;
Para comprobar si el href
atributo existe, puede hacer
echo $node->hasAttribute( 'href' );
Para obtener el href
atributo que harías
echo $node->getAttribute( 'href' );
Para cambiar el href
atributo que harías
$node->setAttribute('href', 'something else');
Para eliminar el href
atributo que harías
$node->removeAttribute('href');
También puede consultar el href
atributo 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 esto es un duplicado y puede encontrar la respuesta en algún lugar aquí
Estoy de acuerdo con Gordon, DEBES usar un analizador HTML para analizar HTML. Pero si realmente quieres una expresión regular, puedes probar esta:
Esto coincide
<a
al principio de la cadena, seguido de cualquier número de cualquier carácter (no codicioso) y.*?
luegohref=
seguido del enlace rodeado por"
o'
Salida:
fuente
El patrón que desea buscar sería el patrón de anclaje de enlace, como (algo):
fuente
¿Por qué no simplemente emparejas?
luego
que funciona. Acabo de quitar las primeras abrazaderas de captura.
fuente
preg_match_all("/<a.*?href\s*=\s*['\"](.*?)['\"]/", $str, $res, PREG_SET_ORDER);
para capturar correctamente todos los valores href en el usoforeach($res as $key => $val){echo $val[1]}
Para quien aún no obtiene las soluciones muy fáciles y rápidas usando SimpleXML
Esta funcionando para mi
fuente
No estoy seguro de lo que está tratando de hacer aquí, pero si está tratando de validar el enlace, mire el filter_var () de PHP
Si realmente necesita usar una expresión regular, consulte esta herramienta, puede ayudar: http://regex.larsolavtorvik.com/
fuente
Usando su expresión regular, la modifiqué un poco para satisfacer sus necesidades.
<a.*?href=("|')(.*?)("|').*?>(.*)<\/a>
Yo personalmente sugiero que use un analizador HTML
EDITAR: Probado
fuente
<a title="this" href="that">what?</a>
Examen rápido:
<a\s+[^>]*href=(\"\'??)([^\1]+)(?:\1)>(.*)<\/a>
parece hacer el truco, siendo la primera coincidencia "o", la segunda el valor de "href" "eso" y la tercera el "qué?".La razón por la que dejé la primera coincidencia de "/ 'allí es que puedes usarla para hacer una referencia inversa más tarde para el cierre" /', por lo que es lo mismo.
Vea el ejemplo en vivo en: http://www.rubular.com/r/jsKyK2b6do
fuente
preg_match_all ("/ (] >) (. ?) (</ a) /", $ contenido, $ impmatches, PREG_SET_ORDER);
Se prueba y obtiene todas las etiquetas de cualquier código html.
fuente
Lo siguiente funciona para mí y devuelve ambos
href
yvalue
de la etiqueta de anclaje.La matriz multidimensional llamada
$urls
ahora contiene submatrices asociativas que son fáciles de usar.fuente