2011-07-04 2 views
0

pourriez-vous me aider à la regex pour les exemples suivants:

lorem ipsum size large lorem ipsum 

ou

lorem ipsum size m lorem ipsum 

ou

lorem ipsum size 39.5 lorem ipsum 

donc dans Bref, j'essaie d'extraire un mot/chaîne après le mot/delimter taille jusqu'à ce que le blanc suivant espace. donc dans les exemples ci-dessus ce serait (dans l'ordre): grand, m, 39.5.

Des idées?

mise à jour rapide: pourrait vous s'il vous plaît inclure également une possibilité de

size:$(size) 

ou

size: $(size) 

ou

size $(size) 
+0

Avez-vous besoin de l'extraire ou de le remplacer? Utilisez ['preg_replace()'] (http://www.php.net/preg_replace) pour remplacer, ['preg_match()'] (http://www.php.net/preg_match) ou ['preg_match_all() '] (http://www.php.net/preg_match_all) pour l'extraction. – binaryLV

+0

Je dois l'extraire, merci – Marcin

Répondre

1
$strings = array(
    'lorem ipsum size large lorem ipsum', 
    'lorem ipsum size m lorem ipsum', 
    'lorem ipsum size 39.5 lorem ipsum ', 
); 
foreach ($strings as $string) { 
    if (preg_match('#\bsize\b\s+(\S+)\s#', $string, $matches)) { 
     echo "<b>Matched '{$string}':</b>\n\n"; 
     print_r($matches); 
    } 
} 

Sortie:

Matched 'lorem ipsum size large lorem ipsum': 
Array 
(
    [0] => size large 
    [1] => large 
) 

Matched 'lorem ipsum size m lorem ipsum': 
Array 
(
    [0] => size m 
    [1] => m 
) 

Matched 'lorem ipsum size 39.5 lorem ipsum ': 
Array 
(
    [0] => size 39.5 
    [1] => 39.5 
) 

Taille est stockée dans $matches[1].

+0

des trucs géniaux, mais s'il y avait la taille :? – Marcin

+1

Comme 'taille: large'? Ensuite, utilisez "# \ bsize \ b:? \ S + (\ S +) \ s #" comme motif, il inclut l'option ":" après "size". J'ai également remarqué qu'il y a des inutiles '\ b' après' size' et '\ s' à la fin, cela peut être juste' '# \ bsize:? \ S + (\ S +) #' '. – binaryLV

+0

cool mais ne fonctionne pas pour la taille: large, doit être suivi par l'espace pour travailler – Marcin

3
if (preg_match('/\bsize\W+(\S+)/', $subject, $regs)) { 
    $result = $regs[1]; 
} else { 
    $result = ""; 
} 

\bsize\W+ correspond size plus un ou plusieurs caractères non alphanumériques (espaces, ponctuation, etc.), mais il ne correspond pas capsize en raison de l'ancre de délimitation de mots \b.

Puis (\S+) correspond à un ou plusieurs caractères non-espaces et les capture dans la première référence arrière ($regs[1] dans ce cas).

0
preg_match('/\ssize\s+(\S+)/', $string, $matches); 
echo $matches[1]; 
+1

Je pense que cela ne fonctionnera pas. PHP n'autorise pas la répétition infinie dans les assertions lookbehind. Ou cela a-t-il changé dans les versions plus récentes? –

+0

@Tim Vous aviez raison :) – Karolis