Nueva pregunta

Pregunta:

Fecha: 23-04-2019 08:52:17 (En Español)

Reconocer posiciones de palabras clave repetidas en una cadena te texto[Resuelta]

Hola que tal tengo el siguiente código
Funciona correctamente pero solo me halla las primeras coincidencias, es decir si se me repite una palabra en la cadena de texto no la va a encontrar, alguna sugerencia ?

$CuerpoDelCorreoTxt = "BL:859447 Hola buenos días  BL:454545 FechaEta:12/12/019 Factura:094740 Pedido:43893.
Cordialmente.


ALEXANDER  O.
";
$PalabrasClaveArray = array('BL:', 'bl:', 'Factura:', 'FechaEta:', 'fechaeta:', 'Pedido:', 'pedido:', 'FIN', 'fin', 'Fin');

foreach ($PalabrasClaveArray as $PalabrasClave) {

    $posicionPalabraClave = strpos($CuerpoDelCorreoTxt, $PalabrasClave);

    if ($posicionPalabraClave !== false) {
        echo $posicionPalabraClave . "=$PalabrasClave</br>"; #

    }
}


si ejecuto me responde con esto
0=BL:
58=Factura:
39=FechaEta:
73=Pedido:


pero si notan en la cadena a CuerpoDelCorreoTxt la palabra clave BL: se repite 2 veces
Etiquetas: PHP - PHP Avanzado - Pregunta Votos: 0 - Respuestas: 3 - Vistas: 8 Compartir en: Google Facebook Twitter LinkedIn Link
 

Respuestas:

  • Fecha: 23-04-2019 12:04:29 Hola Bryan

    Te dejo un codigo experimental con el cual podrás hacer pruebas y ajustarlo a tus necesidades

    <?php
    function contar_palabras($cadena, $palabraBuscada){
        return count(explode($palabraBuscada,$cadena))-1;
    }
    // Modo de empleo:
    
    $CuerpoDelCorreoTxt = "BL:859447 Hola buenos días  BL:454545 FechaEta:12/12/019 Factura:094740 Pedido:43893.
    Cordialmente.
    ALEXANDER  O.
    ";
    
    $palabraBuscada = 'BL';
    
    echo contar_palabras($CuerpoDelCorreoTxt, $palabraBuscada);
    // Resultado: 2
    


    Otro codigo de ejemplo:

    <?php
    $CuerpoDelCorreoTxt = "BL:859447 Hola buenos días  BL:454545 FechaEta:12/12/019 Factura:094740 Pedido:43893.
    Cordialmente.
    ALEXANDER  O.
    ";
    $palabraBuscada = 'BL';
    echo "La palabra '$palabraBuscada' se repite: " . substr_count($CuerpoDelCorreoTxt,$palabraBuscada) . " veces<br>"; 
    
    // Resultado: La palabra 'BL' se repite: 2 veces
    ?>
    


    Puedes ver la doc de esta funciones de PHP:
    str_word_count()
    substr_count()

    Es lo que se me ocurre hacer rápidamente. Seguro que habrá alguna manera más eficiente de hacerlo.

    Saludos
      Votos: 2 - Link respuesta
     
  • Fecha: 23-04-2019 12:20:13 Hola Bryan,
    Usas la función equivocada. strpos te devuelve la primera posición de la palabra que buscas, nunca te va a devolver las siguientes.

    Yo utilizaría expresiones regulares.

    Modifique tu código un poco para aplicarle algo de formato estándar y darte un ejemplo:

    <?php
    $cuerpoDelCorreoTxt = "BL:859447 Hola buenos días  BL:454545 FechaEta:12/12/019 Factura:094740 Pedido:43893.
    Cordialmente.
    ALEXANDER  O.
    ";
    $palabrasClave = '/(bl|factura|fechaeta|pedido):/mi';
    $resultados = null;
    
    $encontrados = preg_match_all($palabrasClave, $cuerpoDelCorreoTxt, $resultados, PREG_OFFSET_CAPTURE);
    
    if ($encontrados !== false) {
        foreach($resultados[0] as $resultado) {
            echo "{$resultado[0]} = {$resultado[1]}" . PHP_EOL;
        }
    }
    
      Votos: 3 - Link respuesta
     
  • Fecha: 23-04-2019 15:34:06 Muchas gracias, excelente ayuda, Walter Sánchez me gusto tu función pero realmente quiero extraer los datos que están seguido del Valor o palabra clave a buscar tu función me sirve para validar información.

    Ernesto Peimbert me funcionó a la perfección estaba intentándolo así:
    $lastPos   = 0;
                $positions = array();
    
                while (($lastPos = strpos($CuerpoDelCorreoTxt, $PalabraClave, $lastPos)) !== false) {
                    $positions[] = $lastPos;
                    $lastPos     = $lastPos + strlen($PalabraClave);
                }
    
                foreach ($positions as $posicionPalabraClave) {
                    InsertarPosiciones($PalabraClave, $posicionPalabraClave, $idMensaje, 3);
                }
    
    


    La palabra clave la traigo en una consulta individual
      Votos: 1 - Link respuesta
     
Para participar activamente de la comunidad primero debes autenticarte, ingresa al sistema.Iniciar Sesión
 
frjcbbae garagebible.com