//Url a escrapear
$url="http://trifulcas.com";
//Archivo para guardar
$file="scrap.txt";
$visitadas=[];
$fichero=fopen($file,"w");
scrap($url);
fclose($fichero);
die();
function scrap($url){
global $visitadas,$fichero;
//Guardo la url en visitadas
$visitadas[]=$url;
//Leo el contenido de la web
$web= file_get_contents($url);
//Proceso de datos: en este caso simplemente guardo el texto
fwrite($fichero,$url);
fwrite($fichero,strip_tags($web));
//Busco todos los enlaces de la web
preg_match_all("<a href=[\"\'](.+?)[\"\']>", $web, $matches);
foreach($matches[1] as $enlace){
//Si son enlaces internos y no han sido visitados llamamos a la función recursivamente
if (strpos($enlace,$url)!==false && !in_array($enlace, $visitadas)){
scrap($enlace);
}
}
}
Leer una web y extraer datos
<?php
function extrae($cadena, $inicio, $fin) {
$pos = strpos($cadena, $inicio);
if ($pos === false) {
return "";
}
$pos2 = strpos($cadena, $fin, $pos + strlen($inicio));
if ($pos2 === false) {
return "";
}
return substr($cadena, $pos + strlen($inicio), $pos2 - $pos - strlen($inicio));
}
function extraeRegexp($cadena, $inicio, $fin) {
preg_match_all('#' . $inicio . '(.*?)' . $fin . '#', $cadena, $matches);
return $matches[1];
}
//Lee archivo y lo mete en un string
$datos = file_get_contents("https://www.guiadelocio.com/teatro-y-danza");
$pos = strpos($datos, "item-listado-AB");
$items = [];
while ($pos !== false) {
$pos2 = strpos($datos, "</div>", $pos);
$items[] = substr($datos, $pos, $pos2 - $pos);
$pos = strpos($datos, "item-listado-AB", $pos + 1);
}
$fichero = fopen("teatro.csv", "a");
foreach ($items as $item) {
$titulo = strip_tags(extraeRegexp($item, 'alt="', '"')[0]);
echo $titulo . "<br/>";
$resto = strip_tags(extraeRegexp($item, '<p class="ubicacion">', '</p>')[0]);
echo $resto . "<br/>";
$resto = explode(",", $resto);
print_r($resto);
fwrite($fichero, utf8_decode(date("d-m-Y") . ";" . $titulo . ";" .
$resto[0] . ";" . $resto[1] . "\n"));
}
fclose($fichero);
//echo($datos);
?>
Funciones de ficheros
http://php.net/manual/en/ref.filesystem.php
https://www.w3schools.com/php/php_ref_filesystem.asp
<?php
$fichero=fopen("datos.txt","a");
fwrite($fichero,"Lo que quiero que se escriba en el fichero\n");
fwrite($fichero,"otra cosa");
fclose($fichero);
$fichero=fopen("tabla.txt","a");
for($i=1;$i<=10;$i++){
fwrite($fichero,$i." x 5 = ".($i*5)."\n");
}
fclose($fichero);
$fichero=fopen("datos.txt","r");
while(!feof($fichero)){
$linea=fgets($fichero);
echo $linea."<br/>";
}
fclose($fichero);
?>
Ejercicio equipos
Index:
<h1>Página super guay</h1>
Hola, dinos tu nombre para saber como dirigirnos hacia ti:
<form action="panel.php">
<input type="text" name="nombre">
<input type="submit">
</form>
Panel:
<?php
session_start();
require_once 'librerias.php';
$nombre = filter_input(INPUT_GET, 'nombre', FILTER_SANITIZE_STRING);
if (empty($nombre) && !isset($_SESSION['nombre'])) {
?>
<h2>No has introducido ningún nombre. Por favor vuelve atrás.</h2>
<a href="index.php">Vuelve atrás y pon un nombre ¡hombre!</a>
<?php
} else {
if (!empty($nombre)) {
$_SESSION['nombre'] = $nombre;
} else {
$nombre = $_SESSION['nombre'];
}
?>
<h1>Hola <?= $nombre ?>, bienvenido a la página superguay</h1>
<a href="equipos.php">Introducir equipos</a><br/>
<a href="resultados.php">Introducir resultados</a>
<?php
if (isset($_SESSION['equipos'])) {
?>
<a href="resultados.php">Introducir resultados</a>
<?php
pintaEquipos($_SESSION['equipos']);
}
if (isset($_SESSION['equipos']) && isset($_SESSION['resultados'])) {?>
<a href="resultados.txt">Descargar resultados</a>
<?php
muestraResultados($_SESSION['equipos'], $_SESSION['resultados']);
}
}
?>
equipos:
<h1>Introduzca los equipos separados por comas</h1>
<form action="guardar_equipos.php">
<input type="text" name="equipos" size="100">
<input type="submit">
</form>
guardar_equipos:
<?php
session_start();
require_once 'librerias.php';
// Recuperar los equipos que nos han mandado
$equipos = filter_input(INPUT_GET, "equipos");
// Si está vacío poner un aviso y enlace a equipos.php
if (empty($equipos)) {
?>
<h1>No has mandado equipos, inténtalo de nuevo</h1>
<a href="equipos.php">Volver a equipos</a>
<?php
} else {
//Si no está vacío convertir la lista de equipos en un array
$tabla = explode(",", $equipos);
//guardarlo en la variable de sesión equipos
$_SESSION['equipos'] = $tabla;
// Y mostrarlo como una tabla HTML
pintaEquipos($tabla);
}
?>
<a href="panel.php">Volver al panel</a>
resultados:
<?php
session_start();
require_once 'librerias.php';
if(isset($_SESSION['equipos'])){
pintaResultados($_SESSION['equipos']);
}
else{
?>
<h1>No hay equipos definidos, vuelva atrás</h1>
<a href="panel.php">Volver atrás</a>
<?php
}
?>
guardar_resultados:
<?php
session_start();
require_once 'librerias.php';
// Recuperar los resultados que nos han mandado
$resultados = filter_input(INPUT_POST, 'resultado',FILTER_DEFAULT, FILTER_REQUIRE_ARRAY);
// Si está vacío poner un aviso y enlace a equipos.php
if (empty($resultados)) {
?>
<h1>No has mandado resultados, inténtalo de nuevo</h1>
<a href="resultados.php">Volver a resultados</a>
<?php
} else {
//guardarlo en la variable de sesión resultados
$_SESSION['resultados'] = $resultados;
// Y mostrarlo como una tabla HTML
muestraResultados($_SESSION['equipos'],$_SESSION['resultados']);
guardaResultados($_SESSION['equipos'],$_SESSION['resultados']);
}
?>
<a href="panel.php">Volver al panel</a>
librerias:
<?php
function pintaEquipos($tabla) {
?>
<table>
<tr><td>Equipos</td></tr>
<?php foreach ($tabla as $valor) { ?>
<tr><td><?= ucfirst($valor) ?></td></tr>
<?php } ?>
</table>
<?php
}
function pintaResultados($tabla) {
?>
<form action="guardar_resultados.php" method="post">
<table>
<tr><td>Resultados</td></tr>
<?php for ($i = 0; $i < count($tabla); $i += 2) { ?>
<tr><!--<td><?php
echo $tabla[$i];
if (isset($tabla[$i + 1])) {
echo " - " . $tabla[$i + 1];
}
?></td>-->
<td><?= $tabla[$i] . (isset($tabla[$i + 1]) ? " - " . $tabla[$i + 1] : "") ?></td>
<td><input type="text" name="resultado[]"></td>
</tr>
<?php } ?>
</table>
<input type="submit">
</form>
<?php
}
function muestraResultados($equipos,$resultados) {
?>
<table>
<tr><td>Resultados</td></tr>
<?php for ($i = 0; $i < count($equipos); $i += 2) { ?>
<tr>
<td><?= $equipos[$i] . (isset($equipos[$i + 1]) ? " - " . $equipos[$i + 1] : "") ?></td>
<td><?=$resultados[$i/2]?></td>
</tr>
<?php } ?>
</table>
<?php
}
function guardaResultados($equipos, $resultados, $archivo = "resultados.txt",$tipo="w") {
$fichero = fopen($archivo, $tipo);
fwrite($fichero, "Resultados\n");
for ($i = 0; $i < count($equipos); $i += 2) {
fwrite($fichero, $equipos[$i] . (isset($equipos[$i + 1]) ? " - " . $equipos[$i + 1] : ""));
fwrite($fichero, " : ".$resultados[$i / 2] . "\n");
}
fclose($fichero);
}
Recorrer arrays en php
Para recorrer un array normal podemos usar tanto un for normal como un foreach:
$t=[3,7,23,4];
for($i=0;$i<count($t);$i++){
echo $t[$i]."-";
}
echo "<br/>";
foreach($t as $valor){
echo $valor."-";
}
Para recorrer un array asociativo sólo podemos usar un foreach:
$a=["q"=>1,"w"=>2,"e"=>3];
foreach($a as $valor){
echo $valor."-";
}
Ejemplos arrays en php
Mostrar una tabla con print_r y
para el formato:function muestraTabla($tabla) { echo "<pre>"; print_r($tabla); echo "</pre>"; }Mostrar una tabla bidimensional en formato tabla de HTML:
function creaTabla($tabla) { ?><table><?php foreach ($tabla as $fila) { ?><tr><?php foreach ($fila as $valor) { ?><td><?= $valor ?></td><?php } ?> </tr><?php } ?> </table><?php }Función que nos devuelve el elemento más frecuente de una tabla:
function frecuente($tabla) { $t = array_count_values($tabla); arsort($t); $res = []; $max = array_values($t)[0]; foreach ($t as $clave => $valor) { if ($valor == $max) { $res[] = $clave; } } return $res; }Diagonales:
/* * Nos devuelve un array bidimensional del tamaño que le indiquemos * Relleno de ceros menos la diagonal principal que valdrá 1 * Ejemplo: diagonal(3) * 1 0 0 * 0 1 0 * 0 0 1 */ creaTabla(diagonal2(20)); function diagonal($tam) { $res = []; for ($i = 0; $i < $tam; $i++) { $res[$i] = array_fill(0, $tam, 0); $res[$i][$i] = 1; } return $res; } function diagonal2($tam) { $res = []; for ($i = 0; $i < $tam; $i++) { for ($j = 0; $j < $tam; $j++) { if ($i == $j) { $res[$i][$j] = 1; } else { $res[$i][$j] = 0; } } } return $res; }
Ejemplos funciones con arrays
function calcetin($tabla) {
$res = [];
foreach ($tabla as $clave => $valor) {
$res[$valor] = $clave;
}
return $res;
}
$t = ["a" => 1, "b" => 3, "c" => 1];
muestraTabla($t);
$c = calcetin($t);
muestraTabla($c);
function contar($tabla, $valor) {
$cont = 0;
foreach ($tabla as $v) {
if ($valor == $v) {
$cont++;
}
}
return $cont;
}
echo esUnico1($t);
function esUnico1($tabla) {
foreach ($tabla as $valor) {
if (contar($tabla, $valor) > 1) {
return false;
}
}
return true;
}
function esUnico2($tabla) {
$t = array_count_values($tabla);
foreach ($t as $valor) {
if ($valor > 1) {
return false;
}
}
return true;
}
function esUnico3($tabla){
sort($tabla);
for($i=1;$i<count($tabla);$i++){
if ($tabla[$i]==$tabla[$i-1]){
return false;
}
}
return true;
}
function esUnico4($tabla){
return count($tabla)==count(array_unique($tabla));
}
Ejemplo de función levenheist
echo masParecida("tomato", ["naranja","tomate","platano","morcilla"]);
echo masParecida("marnaja", ["naranja","tomate","platano","morcilla"]);
function masParecida($entrada, $palabras) {
// no se ha encontrado la distancia más corta, aun
$distancia = -1;
$cercana = "";
// bucle a través de las palabras para encontrar la más cercana
foreach ($palabras as $palabra) {
// calcula la distancia entre la palabra de entrada y la palabra actual
$lev = levenshtein($entrada, $palabra);
// verifica por una coincidencia exacta
if ($lev == 0) {
// la palabra más cercana es esta (coincidencia exacta)
return $palabra;
}
// si esta distancia es menor que la siguiente distancia
// más corta o si una siguiente palabra más corta aun no se ha encontrado
if ($lev <= $distancia || $distancia < 0) {
$cercana = $palabra;
$distancia = $lev;
}
}
return $cercana;
}
Funciones de cadena en PHP
Buscar una subcadena dentro de otra. Ejemplo ‘¿Tiene una cadena la @?’:
if (strpos($_POST['email'], '@') === false) {
print 'No hay arroba (@)';
}
Ponemos ‘===’ porque si la arroba está en la posición 0 se entiende como false.
El siguiente código nos devuelve el número de apariciones de una cadena en otra:
function contarCadena($pajar, $aguja) {
$pos = strpos($pajar, $aguja);
$cont = 0;
while ($pos !== false) {
$cont++;
$pos = strpos($pajar, $aguja, $pos + 1);
}
return $cont;
}
Obtener subcadenas de una cadena. Ejemplo: ‘Obtener los cuatro primeros caracteres del código’.
$substring = substr($string,$start,$length); $codigo='ABCD123456'; $parte=substr($codigo,0,4); //$parte='ABCD' $parte=substr($codigo,4,4); //$parte='1234' $parte=substr($codigo,4); //$parte='123456' $parte=substr($codigo,-4); //$parte='3456'
Ejercicio: dada una cadena obtener otra con los dos primeros caracteres y los dos últimos.
Mayúsculas y minúsculas:
print ucfirst("how do you do today?"); //Primera letra
print ucwords("the prince of wales"); //primera letra de cada palabra
print strtoupper("i'm not yelling!"); //mayúsculas
print strtolower('<a href="one.php">one</a>'); // minúsculas
Partir cadenas con explode (por separador):
$cadena="hola que tal";
$palabras=explode($cadena); //Array ( [0] => hola [1] => que [2] => tal )
echo implode("-",$palabras);//hola-que-tal
Reemplazar una cadena por otra:
echo str_replace("a", "#", "hola que tal"); //hol# que t#l
Repetir una cadena:
echo str_repeat("|-|",6); //|-||-||-||-||-||-|
Funciones ajedrez y tabla
function ajedrez($tam) {
?>
<table >
<?php
for ($i = 0; $i < $tam; $i++) {
?><tr><?php
for ($j = 0; $j < $tam; $j++) {
?><td class="<?= ($i + $j) % 2 == 0 ? "" : "dark" ?>"></td><?php }
?></tr><?php
}
?>
</table><?php
}
function tabla($tabla) {
?><table>
<?php
for ($i = 1; $i <= 10; $i++) {
?>
<tr><td><?= $i ?></td><td>x</td><td><?= $tabla ?></td>
<td>=</td><td><?= ($i * $tabla) ?></td></tr>
<?php
}
?>
</table><?php
}