Pregunta

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

Actualmente tengo esto:

$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;
  }
}
¿Fue útil?

Solución

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

Habiendo dicho eso:

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

Otros consejos

Soy un gran admirador de las expresiones regulares, pero este no es el lugar adecuado para usarlas.

Utilice un analizador HTML real.

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

Busqué en Google un analizador PHP HTML y encontré este .

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

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

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

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

$ 2 = Ir a stackoverflow.com

Respondí una pregunta similar para eliminar todo excepto las etiquetas aquí

Regex, la magia negra, otra vez :)

Encontré una buena pregunta sobre expresiones regulares comunes. Hay algunos enlaces interesantes donde encontrará expresiones regulares muy comunes como la suya.

  

Agarrando etiquetas HTML

     

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

     

< ([AZ] [A-Z0-9] ) \ b [^ >] > (. *?) Analice esta expresión regular con RegexBuddy coincidirá con la apertura y el cierre par de cualquier etiqueta HTML. Asegúrese de desactivar 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. Esta solución tampoco coincidirá con las etiquetas anidadas en sí mismas.

De lo contrario: explore este enlace: palabra clave " link " . Hay algunos enfoques interesantes para filtrar enlaces.

Espero que esto ayude :)

¡Buena suerte!

Bueno ... Usar expresiones regulares no es perfecto, pero en expresiones regulares perl,

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

debería darle el nombre del primer enlace en esa línea en el grupo uno, ignorando mayúsculas y minúsculas.

Limitaciones:

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

Puede solucionar este problema uniendo todas las líneas en una sola línea y luego dividiéndola en una matriz (o varias líneas) utilizando el inicio de enlace como separador.

La mejor y más rápida forma de crear una lista de lo que está en medio 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
)

Con el patrón

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

Obtendrás

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

Buscando en este marcado:

<span id="hlinks-nav"><a href="/users/login?returnurl=%2fquestions%2f343115%2fregexp-for-finding-everything-between-a-and-a-tags">sign up</a><span class="lsep">|</span><a href="/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>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top