Obtenga un valor entero de una cadena de consulta mal formada

2 minutos de lectura

Avatar de usuario de MonkeyBlue
MonoAzul

Estoy buscando una manera de analizar una subcadena usando PHP, y me encontré con preg_match, sin embargo, parece que no puedo resolver la regla que necesito.

Estoy analizando una página web y necesito tomar un valor numérico de la cadena, la cadena es así

producturl.php?id=736375493?=tm

Necesito poder obtener esta parte de la cadena:

736375493

Avatar de usuario de David Fells
david cae

$matches = array();
preg_match('/id=([0-9]+)\?/', $url, $matches);

Esto es seguro si el formato cambia. La respuesta de Slandau no funcionará si alguna vez tiene otros números en la URL.

php.net/preg-match

  • Gracias por la sugerencia, probé este código inicialmente y no funcionó, así que lo modifiqué para preg_match('/id=(.*)\?/', $url, $matches); y ahora funciona perfectamente. Gracias 🙂

    – Mono Azul

    9 mayo 2011 a las 20:52

<?php
$string = "producturl.php?id=736375493?=tm";
preg_match('~id=(\d+)~', $string, $m );
var_dump($m[1]); // $m[1] is your string
?>

  • esta en $m[1] porque (de los documentos): “Si se proporcionan coincidencias, se completa con los resultados de la búsqueda. $ coincidencias[0] contendrá el texto que coincide con el patrón completo, $coincide[1] tendrá el texto que coincidió con el primer subpatrón entre paréntesis capturado, y así sucesivamente”.

    – bnunamak

    9 de julio de 2017 a las 7:51

$string = "producturl.php?id=736375493?=tm";
$number = preg_replace("/[^0-9]/", '', $string);

  • si la cadena es como producturl.php?id=736375493?=tm&page=2 vas a terminar con 2 extra en tu $number.

    – UnkwnTech

    9 de mayo de 2011 a las 20:09

  • Muy cierto, supuse que todas sus cadenas estarían en el formato que publicó.

    – slandau

    9 mayo 2011 a las 20:10

  • Sí, esto me está dando un número adicional en la cadena, acabo de probar esto que funciona hasta cierto punto. preg_match('/id(.*)=', $body, $matches); pero todavía me da =tm al final del número en algunas líneas.

    – Mono Azul

    9 mayo 2011 a las 20:27


avatar de usuario de mickmackusa
mickmackusa

Desafortunadamente, tiene una cadena de consulta de URL mal formada, por lo que una técnica de expresiones regulares es la más apropiada. Ver lo que quiero decir.

No hay necesidad de grupos de captura. solo emparejar id= entonces olvida esos personajes con \Kluego aísle los siguientes uno o más caracteres digitales.

Código (Manifestación)

$str="producturl.php?id=736375493?=tm";
echo preg_match('~id=\K\d+~', $str, $out) ? $out[0] : 'no match';

Producción:

736375493

Para completar, hay otra forma de escanear el Fcadena con formato y devuelve explícitamente un valor de tipo int. (Manifestación)

var_dump(
    sscanf($str, '%*[^?]?id=%d')[0]
);

Él %*[^?] significa: hacer coincidir con avidez uno o más caracteres que no sean signos de interrogación, pero no capturar la subcadena. El resto del parámetro de formato coincide con la secuencia literal ?id=, luego captura con avidez uno o más números. El valor devuelto se convertirá en un número entero debido a la %d marcador de posición

¿Ha sido útil esta solución?