2008-12-05 7 views
5

Estoy tratando de encontrar una manera de hacer una lista de todo entre <a> y </a> etiquetas. Así que tengo una lista de enlaces y quiero obtener los nombres de los enlaces (no a dónde van los enlaces, sino a qué se llaman en la página). Sería realmente útil para mí.regexp para encontrar todo entre <a> y</a> etiquetas

Actualmente tengo unas pocas cosas:

$lines = preg_split("/\r?\n|\r/", $content); // content is the given page 
foreach ($lines as $val) { 
    if (preg_match("/(<A(.*)>)(<\/A>)/", $val, $alink)) {  
    $newurl = $alink[1]; 

    // put in array of found links 
    $links[$index] = $newurl; 
    $index++; 
    $is_href = true; 
    } 
} 
+0

3? 4? veces en tantos días * suspiro * – annakata

+0

¿Deberíamos cerrar eso ya que es una pregunta muy reciente? –

+0

Parcialmente esto se debe a que la función "preguntas relacionadas" no funciona demasiado bien. En parte, esto se debe a que las personas no buscan en Google antes de hacer preguntas (las que misteriosamente dejan de hacer preguntas de este tipo). – Tomalak

Respuesta

13

Se aplica el descargo de responsabilidad estándar: El análisis HTML con expresiones regulares no es ideal. El éxito depende de la buena formación de la entrada en un nivel de carácter por carácter. Si no puede garantizar esto, la expresión regular no podrá hacer lo correcto en algún momento.

Una vez dicho esto:

<a\b[^>]*>(.*?)</a> // match group one will contain the link text 
+1

+1. Sería ] *> ([^ <]*?) caso mejor? –

+0

Este coincidirá con cualquier etiqueta que comienza con "A", hasta un/a. (. *) distinguirá un tag – Xetius

+0

HTML 4.01/XHTML 1.0 define a, abbr, acrónimo, dirección, applet y etiquetas de área que coincidirán con – Xetius

0

expresión regular, la magia negro, de nuevo :)

encontré uno nice question acerca de expresiones regulares común. Hay algunos enlaces interesantes donde encontrará expresiones regulares muy comunes como la suya.

Agarrando etiquetas HTML

< TAG \ b [^>] > (.?) Analizar esta expresión regular con RegexBuddy coincide con la apertura y el cierre de un par etiqueta HTML específica. Cualquier cosa entre las etiquetas se captura en la primera referencia inversa. El signo de interrogación en la expresión regular hace que la estrella sea floja, para asegurarse de que se detiene antes de la primera etiqueta de cierre en lugar de antes de la anterior, como lo haría una estrella codiciosa. Esta expresión regular no coincidirá adecuadamente con las etiquetas anidadas dentro de sí mismas, como en onetwoone.

< ([A-Z] [A-Z0-9] ) \ b [^>]> (. *?) Analizar esta expresión regular con RegexBuddy coincidirá con la apertura y el cierre de cualquier par de etiquetas HTML. Asegúrese de desactivar la sensibilidad de mayúsculas y minúsculas. La clave en esta solución es el uso de la referencia inversa \ 1 en la expresión regular. Cualquier cosa entre las etiquetas se captura en la segunda referencia inversa. Esta solución tampoco coincidirá con las etiquetas anidadas en sí mismas.

De lo contrario: Hojee este enlace: keyword "link". Hay algunos enfoques interesantes para filtrar enlaces.

espero que esto ayude :)

Buena suerte!

0

Bueno .. Uso de expresiones regulares no es perfecto, pero en la expresión regular Perl,

m!<a .*?>(.*?)</a>!i 

debería darle el nombre del primer eslabón en esa línea en unir el grupo uno, ignorando el caso.

Limitaciones:

  • no maneja múltiples enlaces en una línea
  • no controla enlaces que pasan varias líneas.
  • También coincidirá en etiquetas de anclaje.

Puede solucionar esto uniendo todas las líneas en una línea y luego dividirla en una matriz (o varias líneas) usando el inicio del enlace como separador.

2
<a\s*(.*)\>(.*)</a> 

<a href="http://www.stackoverflow.com">Go to stackoverflow.com</a> 

$ 1 = href = "www.stackoverflow.com"

$ 2 = Ir a stackoverflow.com

Me respondió una pregunta similar a despojar de todo menos un tag here

+0

Cambié mi respuesta a la cuenta de este escenario, gracias por la sugerencia. Sin embargo, tu "(. *)" Es incorrecto debido a la estrella codiciosa. – Tomalak

3

I Soy un gran fanático de las expresiones regulares, pero este no es el lugar correcto para usarlas.

Utilice un analizador de HTML real.

  • Su código será más claro
  • Será más probable que funcione

busqué en Google para un analizador HTML PHP, y encontré this one.

Si sabe que está trabajando con XHTML, puede usar el analizador XML estándar de PHP.

0

La mejor y más rápida forma de crear una lista de lo que hay entre, es mediante el uso de preg_match_all.

Ejemplo:

$pattern = '#<a[^>]*>([^<]*)<\/a>#'; 
$subject = '<a href="#">Link 1</a> <a href="#">Link 3</a> <a href="#">Link 3</a>'; 
preg_match_all($pattern, $subject, $matches); 
print_r($matches[1]); 

el resultado será:

Array (
[0] => Link 1 
[1] => Link 3 
[2] => Link 3 
) 
0

Con el patrón

'<a.*?>(.*?)</a>' 

Usted obtendrá

['sign up', 'log in', 'careers 2.0'] 

Buscando en este marcado:

<span id="hlinks-nav"><a href="https://stackoverflow.com/users/login?returnurl=%2fquestions%2f343115%2fregexp-for-finding-everything-between-a-and-a-tags">sign up</a><span class="lsep">|</span><a href="https://stackoverflow.com/users/login?returnurl=%2fquestions%2f343115%2fregexp-for-finding-everything-between-a-and-a-tags">log in</a><span class="lsep">|</span><a href="http://careers.stackoverflow.com">careers 2.0</a><span class="lsep">|</span></span> 
Cuestiones relacionadas