Foros del Web » Programando para Internet » PHP »

Problema con preg_macth

Estas en el tema de Problema con preg_macth en el foro de PHP en Foros del Web. Buenas. Quiero coger de una cadena cierto valor, para ello le pongo: (?<valor>) pero no sé como decirle que coja todo lo que encuentra, sería: ...
  #1 (permalink)  
Antiguo 01/07/2013, 05:56
 
Fecha de Ingreso: febrero-2011
Ubicación: Madrid
Mensajes: 62
Antigüedad: 13 años, 2 meses
Puntos: 1
Problema con preg_macth

Buenas.

Quiero coger de una cadena cierto valor, para ello le pongo: (?<valor>) pero no sé como decirle que coja todo lo que encuentra, sería: (?<valor>dame todo lo que tengas)

Más concretamente el ejemplo que utilizo, quiero coger lo del value:

$expresion = '/<input name="data[Hiring][name]" type="text" maxlength="255" value="(?<valor>)" id="HiringName"\s+/';

y luego otro ejemplo que si me funciona, lo que hago es coger el id que viene como parámetro:

$expresion = '/<a href="\/admin\/users\/hirings\/(?<valor>[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})"\s+/';


Miro en el manual pero no logro hacer que funcione lo que pido, y mira que sería fácil porque no está condicionado. Pruebo con [^/]+, pero no lo consigo.

Un saludo.
  #2 (permalink)  
Antiguo 01/07/2013, 06:04
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: Problema con preg_macth

Le has puesto nombre al match, pero no indicas qué es lo que debería hacer match.En tu segundo ejemplo si lo indicas.
Lo siguiente deberia valer:
Código PHP:
Ver original
  1. value="(?<valor>[^"]*)"
  #3 (permalink)  
Antiguo 01/07/2013, 06:55
 
Fecha de Ingreso: febrero-2011
Ubicación: Madrid
Mensajes: 62
Antigüedad: 13 años, 2 meses
Puntos: 1
Respuesta: Problema con preg_macth

Vaya, me siga dando el valor vacio. La cadena existe y la cadena a buscar también, no sé cial podría ser el problema.
  #4 (permalink)  
Antiguo 01/07/2013, 09:22
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Problema con preg_macth

Amigo: te lo hice con expresiones regulares (no una sino varias para bajarle a la complejidad de resolucion) pero te desaconsejo fuertemente el uso de expresiones regulares para parsear tags..... hay muchas variantes que ni siquiera estas considerando:

- Comillas simples o dobles
- El orden de los tribitos
- Cantidad de espacios entre atributos
- Otros atributos que puedan aparecer y tu no te los esperas o con otros valores
- Etc....etc

Usa SimpleXML y lee tu HTML como DOM y trabajalo asi:

Código PHP:
<?php

$html 
= <<<HTML
<html>
<head></head>
<body>
<h1>Probando SimpleXML</h1>
<input name="data[Hiring][name]" type="text" maxlength="255" value="525" id="HiringName" class="alguna" />
</body>
HTML;

$doc = new DOMDocument();
$doc->strictErrorChecking FALSE;
$doc->loadHTML($html);
$doc simplexml_import_dom($doc);

$result $doc->xpath('//input[@name="data[Hiring][name]"]');

var_dump($result);
Logicamente es un inicio.....ni siquiera se si te interprete complemente... pero yo empezaria por ahi... ahora que si me dices que si lo vas a buscar por id="HiringName" (o sea que hay uno solo de esos INPUT en todo el HTML) o por name="data[Hiring][name] o algun detalle mas te ayudo a obtener el VALUE

Sin embargo... para que no digas que es un "escape" ...te doy la solucion con REGEX que desconsejo ***

Código PHP:
<?php

$html 
= <<<HTML
<html>
<head></head>
<body>
<h1>Probando REGEX</h1>
<INPUT name="data[Hiring][name]" type="text" maxlength="255" value="525" id="HiringName" class="alguna" />
<input name="otra_cosa" style="" >
</body>
HTML;

$value null;
$patt '/<input[^>]*(?:\/)?>/i';

preg_match_all($patt,$html,$array_resul);
if (!empty(
$array_resul)){
  
$inputs $array_resul[0];

   
// deberian ignorarse espacios
   
$patt '/id="HiringName"/i'

    foreach (
$inputs as $input)
    {
        
preg_match($patt,$input,$arr);
        
        if (!empty(
$arr)){
            
// ahora busco el VALUE
            
$patt '/value="(.*?)"/i';
            
preg_match($patt,$input,$arr);
         
            if (!empty(
$arr)){
                
$value $arr[1];
            }
        }
            
    }

}

echo 
$value// 525
PD: tu puedes lograr que te funcione HOY con regex pero no puedes garantizar que con otros datos funcione mañana por la gran complejidad y variabilidad de los tags
__________________
Salu2!

Última edición por Italico76; 01/07/2013 a las 10:54
  #5 (permalink)  
Antiguo 02/07/2013, 00:18
 
Fecha de Ingreso: febrero-2011
Ubicación: Madrid
Mensajes: 62
Antigüedad: 13 años, 2 meses
Puntos: 1
Respuesta: Problema con preg_macth

Hola italico, lo primero gracias pos la respuesta, es amplia e interesante.

Efectivamente como tu dices, quiero coger solo el value de ese input, y ese input es único en todo el html, digo el html porque lo que estoy haciendo es generar el html con curl.

Mi siguiente paso es enviar un http_post_request con el name que se encuentra en el value de ['Hiring']['name'] , por lo tanto es sólo el value de ese determinado input.

Atendiendo al Regex, es una solución que no entiendo porque me ha funcionado la primera vez pero ahora no, seguiré mirando.


Gracias.

Última edición por davidcm86; 02/07/2013 a las 00:54 Razón: problema codigo

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:04.