Preg_match Ayuda. No se puede leer la cadena del correo electrónico.

Tengo un script que lee correos electrónicos y extrae información del correo electrónico y la guarda en mi base de datos sql. Sin embargo, no inserta ninguna información relacionada con los números de teléfono.

Este es mi código para determinar el número de teléfono:

if (preg_match('|^Phone(.*)>\s*(\S*)<?|U', $lines[$i], $matches)) { $phone = trim($matches[2]); } 

Un correo electrónico de ejemplo sería así:

 Name: Joe Schmoe E-mail Address: joeschmoe@joeschmoe.com Phone: 555-555-5555 

Aquí hay una muestra de fuente de lo que proporciona el correo electrónico:

  Phone: 555-555-5555

Parece que la variable $phone termina siendo vacía o nula, ya que no se está insertando en la base de datos, pero toda mi otra información es …

Alguna sugerencia sobre este asunto?

Aquí hay una expresión regular limpia que debería hacer el truco para usted. Permite que las secuencias de dígitos estén separadas opcionalmente por espacios o guiones:

 $re = '% # Rev:20111101 # Match phone number after "phone:". phone: # Literal text: "phone:". \s* # Optional (zero or more) whitespace.  # Literal text: "". \s* # Optional whitespace. ( # Capture group $1: [0-9]+ # {normal+} One or more digits. (?: # Group for optional digit separators. [ -] # {special} Digit separator. [0-9]+ # {normal+} More one or more digits. )* # End {(special normal+)*} construct. ) # End $1: Phone number. \s* # Optional whitespace. < # Ensure number followed by literal "<". %ix'; // Use 'x'-free-spacing and 'i'-case-insensitive mode. if (preg_match($re, $lines[$i], $matches)) { $phone = $matches[1]; } 

¡No uses el modificador U ungreedy!

Usar el modificador U greedy NO es las mejores prácticas, siempre se debe evitar. Cuando necesite hacer un cuantificador individual perezosa, solo agregue el ? modificador al cuantificador específico. Tenga en cuenta que el uso del modificador de modo U nunca se necesita o no está garantizado; todo lo que hace sirve para confundir al lector.

Edit 2011-11-01 3:14 pm MDT "Rompió" regex reescribiéndolo en modo de espacio libre y agregó lots-o-comments.

Su primer (.*) Coincide en modo codicioso: probablemente encontrará que TODO el texto de la cadena desde el Phone adelante hasta el último > en la cadena ha sido absorbido por ese grupo de captura y está en $matches[1]

¿La en el patrón indica que estás trabajando en una cadena HTML? No debe usar expresiones regulares en HTML, ya que pueden / explotarán sobre usted. Use DOM en su lugar para buscar el nodo de número de teléfono y luego extraiga el contenido de texto del nodo. A continuación, puede usar una expresión de subcadena simple para dividir el texto del número de teléfono en Phone: y 555-555-5555 .

Intentaría algo más confiable sin tags html involucradas

| \ bPhone: \ s + (\ S *) |