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?

Solutions Collecting From Web of "Preg_match Ayuda. No se puede leer la cadena del correo electrónico."

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 *) |