2010-10-19 5 views
1

Quelle serait l'expression régulière pour supprimer tout contenu entre un devis et le répertoire "uploads /"?Comment supprimer du contenu entre X et Y en utilisant preg_replace?

L'utilisation d'un générateur de regexpression, je reçois ceci: (? < = \ = ") [^] + (? = Upload /)

$block_data = preg_replace('/(?<=\=")[^]+?(?=uploads/)/g','',$block_data); 

mais semble être enlevaient tout :(

+3

Pouvez-vous donner un exemple pour l'entrée? –

+1

Au lieu d'un générateur regex, j'utiliserais un vérificateur de regex tel que celui de [bokehman] (http://bokehman.com/regex_checker) (mon préféré), ou [gskinner] (http://gskinner.com/ RegExr /), ou [spaweditor] (http://www.spaweditor.com/scripts/regex/) (pour PHP) ou [regexlib] (http://regexlib.com/RETester.aspx). De cette façon, vous apprendrez à les écrire vous-même et vous n'aurez pas besoin d'un générateur. –

Répondre

3

vous devez échapper à la «/» dans « uploads/» et g n'est pas un modificateur valide, plus [^] est invalide, je suppose que vous vouliez . à la place

Voici votre regex.

/(?<=\=").+?(?=uploads\/)/ 

Le test sur ideone

+0

Merci Colin, ça a marché jusqu'à ce que je remarque une chose que j'ai essayé de comprendre. S'il y a plusieurs images/liens que j'ai besoin de faire sur la même ligne, on dirait qu'il récupère tout depuis la toute première citation, jusqu'aux tout derniers uploads/pathname. ie: – kilrizzy

+0

http://ideone.com/Cd5oa – kilrizzy

2

La solution simple serait

$block_data = preg_replace('/(?<=").*?(?=uploads\/)/','',$block_data); 

Modifications apportées:

  1. simplifié votre lookbehind et lookAhead affirmations
  2. ont échappé à la / dans la préanalyse
  3. enlevé le modificateur g, qui est inutile en PHP

Cela fonctionne, pour autant que je peux dire, réduire first"middle/uploads/end" à first"uploads/end".

+0

En simplifiant vous supprimez la partie "=" dans le look-behind (ce qui pourrait être important) et vous avez supprimé la paresse (qui pourrait être dangereux) et l'a remplacé par un optionnel '.' (ce qui est faux étant donné l'expression rationnelle initiale). –

+0

@Colin la spécification est "après une citation" (d'où le changement lookbehind) et "n'importe quel contenu" (d'où le changement de '. *'). J'avais déjà changé le gourmand '*'. – lonesomeday

Questions connexes