2010-09-25 5 views
0

J'essaie d'extraire les informations de l'éditeur à partir d'une chaîne. Il est disponible en différents formats tels que:php regex - extrait tout le texte avant certains caractères

John Wiley & Sons (1995), broché, 154 pages

de New York, Crowell [1963] viii, 373 p. illus. 20 cm.

New York: Bantam Books, c1990. xx, 444 p. : malade ; 27 cm.

Garden City, N.Y., Doubleday, 1963. 142 p. illus. 22 cm. [1 re éd.]

Tout ce que je veux extraire est le nom de l'éditeur, de sorte que tout ce qui suit le (ou [peut être ignoré. Je dois saisir un caractère avant cela, cependant. Et il est compliqué par le fait que par exemple trois, je voudrais saisir l'information avant la virgule, mais dans l'exemple deux, je voudrais attraper l'information avant le crochet seulement si possible et garder cette virgule si possible

Je suis prêt à travailler avec une regex qui prend tout avant ([et, et travailler avec des données imparfaites (comme obtenir seulement "New York" par exemple 2), puisque je ne voudrais pas insérer tout l'exemple 3 dans la base de données. La plupart des données ont la date entre parenthèses comme dans les exemples 1 et 2.

Merci d'avance pour vos suggestions!

Répondre

2

Hm Que diriez-vous remplacer:

[^\w\n\r]+c?[12]\d{3}.* 

avec la chaîne vide? Explication:

[^\w\n\r]+ # any non-word character (but no new lines either!) 
c?   # an optional "c" 
[12]\d{3} # a year (probably, at least) 
.*   # all the rest of the line 

Fonctionne pour votre exemple, peut-être besoin d'un peu de peaufinage supplémentaire.

+0

+1. Probablement aussi proche que possible d'une regex. Mais pourquoi dites-vous de l'exécuter en mode multiligne? Je ne vois aucune ancre de ligne. –

+0

@Alan: Oui, c'est un artefact d'édition. :) Je vais le sortir, j'ai juste oublié de le faire. – Tomalak

+0

Excellent. Cela fonctionne parfaitement. L'autre réponse semble fonctionner aussi, mais celle-ci avait besoin d'être la moins ajustée pour tenir dans mon code. Merci un million! – mandel

1

Voici un: #(.+?)\W*.\d{4}#:

preg_match_all('#(.+?)\W*.\d{4}#', $books, $matches); 
$publishers = array_map('trim', $matches[1]); 

print_r($publishers); 

Génère (comme on le voit sur ideone):

Array 
(
    [0] => John Wiley & Sons 
    [1] => New York, Crowell 
    [2] => New York: Bantam Books 
    [3] => Garden City, N.Y., Doubleday 
) 

Il extrait essentiellement tout ce qui précède la séquence [nombre de caractères non-mot + 1 caractère + Chaîne de 4 chiffres (espérons l'année)].