2012-04-02 13 views
10

estoy luchando con la construcción de una expresión regular para analizar este tipo de cadenas (escrituras de la biblia):PHP formato preg_match biblia escritura

'John 14:16–17, 25–26' 
    'John 14:16–17' 
    'John 14:16' 
    'John 14' 
    'John' 

Así que el patrón básico es:

Book [[Chapter][:Verse]]

donde capítulo y versículo es opcional.

+0

¿Debe coincidir incluso si es solo el nombre del libro? ¿Tiene una lista de libros que debe coincidir? De lo contrario, simplemente coincidiría con cada palabra. – JJJ

+0

Simplemente haga coincidir cualquier palabra, el verdadero problema para mí es tener tantas partes opcionales. – Dziamid

Respuesta

4

Prueba esto aquí

\b[a-zA-Z]+(?:\s+\d+)?(?::\d+(?:–\d+)?(?:,\s*\d+(?:–\d+)?)*)? 

Ver y probarlo here on Regexr

Debido a la (?:,\s*\d+(?:–\d+)?)* al final puede tener una lista de versos, versos oscila en el extremo.

+0

El tuyo es el más general. Solo agregué '[-]' en lugar de guión como sugirió @Robby y algunos corchetes de captura para que sea perfecto. – Dziamid

3

Utilice esta expresión regular:

[A-Za-z]+(([0-9]+)(:[0-9]+)?([\-–][0-9]+)?(, [0-9]+[\-–][0-9]+)?)? 

O en su versión 'más bonita':

\w+((\d+)(:\d+)?([\-–]\d+)?(, \d+[\-–]\d+)?)? 

ACTUALIZADO: para que coincida con guiones o guiones


NOTA: Lo he probado y coincide con TODAS las 5 versiones posibles.

Ejemplo: http://regexr.com?30h4q

enter image description here

9

creo que esto hace lo que necesita:

\w+\s?(\d{1,2})?(:\d{1,2})?([-–]\d{1,2})?(,\s\d{1,2}[-–]\d{1,2})? 

Supuestos:

  • Los números están siempre en series de 1 o 2 dígitos
  • El guión corresponde a ninguno de los siguientes - y

a continuación es la expresión regular con los comentarios:

" 
\w   # Match a single character that is a “word character” (letters, digits, and underscores) 
    +   # Between one and unlimited times, as many times as possible, giving back as needed (greedy) 
\s   # Match a single character that is a “whitespace character” (spaces, tabs, and line breaks) 
    ?   # Between zero and one times, as many times as possible, giving back as needed (greedy) 
(   # Match the regular expression below and capture its match into backreference number 1 
    \d   # Match a single digit 0..9 
     {1,2}  # Between one and 2 times, as many times as possible, giving back as needed (greedy) 
)?   # Between zero and one times, as many times as possible, giving back as needed (greedy) 
(   # Match the regular expression below and capture its match into backreference number 2 
    :   # Match the character “:” literally 
    \d   # Match a single digit 0..9 
     {1,2}  # Between one and 2 times, as many times as possible, giving back as needed (greedy) 
)?   # Between zero and one times, as many times as possible, giving back as needed (greedy) 
(   # Match the regular expression below and capture its match into backreference number 3 
    [-–]  # Match a single character present in the list “-–” 
    \d   # Match a single digit 0..9 
     {1,2}  # Between one and 2 times, as many times as possible, giving back as needed (greedy) 
)?   # Between zero and one times, as many times as possible, giving back as needed (greedy) 
(   # Match the regular expression below and capture its match into backreference number 4 
    ,   # Match the character “,” literally 
    \s   # Match a single character that is a “whitespace character” (spaces, tabs, and line breaks) 
    \d   # Match a single digit 0..9 
     {1,2}  # Between one and 2 times, as many times as possible, giving back as needed (greedy) 
    [-–]  # Match a single character present in the list “-–” 
    \d   # Match a single digit 0..9 
     {1,2}  # Between one and 2 times, as many times as possible, giving back as needed (greedy) 
)?   # Between zero and one times, as many times as possible, giving back as needed (greedy) 
" 

Y aquí están algunos ejemplos de su uso en PHP:

if (preg_match('/\w+\s?(\d{1,2})?(:\d{1,2})?([-–]\d{1,2})?(,\s\d{1,2}[-–]\d{1,2})?/', $subject)) { 
    # Successful match 
} else { 
    # Match attempt failed 
} 

Obtenga una matriz de todas las coincidencias en una cadena dada

preg_match_all('/\w+\s?(\d{1,2})?(:\d{1,2})?([-–]\d{1,2})?(,\s\d{1,2}[-–]\d{1,2})?/', $subject, $result, PREG_PATTERN_ORDER); 
$result = $result[0]; 
+0

¿Coincidirá con el guión o el guión? – Dziamid

+0

sí, ¿es correcto? – Robbie

+0

+1 para esto, gracias – Dziamid

0
([1|2|3]?([i|I]+)?(\s?)\w+(\s+?))((\d+)?(,?)(\s?)(\d+))+(:?)((\d+)?([\-–]\d+)?(,(\s?)\d+[\-–]\d+)?)? 

funciona para casi todos los libros ...

0
(\b[a-zA-Z]\w+\s\d+)(:\d+)+([-–]\d+)?([,;](\s)?(\d+:)?\d+([-–]\d+)?)? 

Este es un híbrido de todos los códigos presentados aquí. Los únicos formatos que no va a destacar son "nombre de libro sólo" o "libro & capítulo sólo" (sólo tiene que añadir ": 1-todo" después del capítulo #) me encontré con los otros códigos proporcionados para calificar demasiadas variaciones , no en línea con la sintaxis del versículo bíblico.

Estos son los ejemplos I a prueba en RegExr: (no se puede publicar imágenes todavía)

John humbolt 14: 16-17, 25-26
John 14: 16-17
John 14:16
John 77: 3; 2: 9-11
Juan 5: 1, todo Brad 555-783-6867
Juan 6
hola como estas
Esdras 32: 5Juan 14 : 16-17, 25-36
23:34
Juan 14: 16-17,25-36
John 14: 16-17; 32:25