2010-11-15 8 views
1

j'ai un texte que je suis analyse comme ceci:PHP et preg_replace

texte. Du texte. Du texte. Certains texte . Du texte. Du texte. Du texte. Du texte. Du texte. Du texte. Certains texte . Du texte. Du texte. Du texte. Du texte. Du texte. Du texte. [attachment = 0] Winter.jpg [/ pièce jointe] Certains texte. Du texte. Du texte. Du texte. Du texte. Du texte. Du texte. Certains texte . Du texte. Du texte. Du texte. Du texte.

Je veux correspondre et supprimer toute instance de texte comme celui-ci de la chaîne:

[attachment=0]Winter.jpg[/attachment] 

où winter.jpg peut être un texte.

Cependant, je reçois des notifications PHP. Je regexpal.com pour construire ce qui fonctionne, mais il utilise une fonction REGEX Javascript:

\[attachment=.*?].*\[/attachment] 

Quand je lance ce code:

$pm_row['message_text'] = preg_replace('\[attachment=.*?\].*\[/attachment\]', '', $pm_row['message_text']); 

PHP se plaint d'un avis:

[phpBB Debug] PHP Notice: in file /mail_digests.php on line 841: preg_replace() [function.preg-replace]: Delimiter must not be alphanumeric or backslash 

Donc sur une ligne similaire de code, je délimite le motif avec un "/":

$post_row['post_text'] = preg_replace('/\[attachment=.*?].*\[/attachment]/', '', $post_row['post_text']); 

Mais cela génère:

[phpBB Debug] PHP Notice: in file /mail_digests.php on line 957: preg_replace() [function.preg-replace]: Unknown modifier 'a' 

Toutes les idées sur la façon de résoudre ce problème?

Répondre

3

Vous devez escape every occurrence of the delimiter inside the pattern:

Si le délimiteur doit être adapté à l'intérieur du modèle, il doit être échappé à l'aide d'une barre oblique inverse. Si le délimiteur apparaît souvent à l'intérieur du motif, il est judicieux de choisir un autre délimiteur afin d'augmenter la lisibilité.

échapper Il:

'/\[attachment=.*?].*\[\/attachment]/' 
        ^

Par ailleurs: Actuellement, le quantifier en .* est gourmand, cela signifie qu'il correspondra autant que possible. Vous voudrez peut-être le changer en une variante non gourmande en utilisant ? comme vous le faisiez auparavant.

+1

+1 Oui, c'est le problème.L'OP devra également rendre le fichier.. '' Ungreedy ('. *?') S'il y a plus d'une pièce jointe dans le texte analysé. – lonesomeday

+0

Merci. Les expressions régulières sont un défi! – Mark

+0

OK, apparemment mon expression a besoin d'un peu de raffinement. Comment j'ai: \t \t \t $ pm_row ['message_text'] = preg_replace ('/ \ [pièce jointe =. *?]. *? \ [\/Pièce jointe] /', '', $ pm_row ['message_text']) ; mais il ne correspond pas à ma chaîne de winter.jpg – Mark

0

Vous avez besoin d'un délimiteur, et vous devez échapper si vous utilisez réellement dans votre expression (i.e. .: [/attachment] a une / dedans). Échappez-vous ou modifiez votre délimiteur (# par exemple).

+0

C'est difficile à voir mais le/est échappé: '/[attachment=.*?].*?[\/attachment]/'. Passer à # \ [pièce jointe =. *?]. *? \ [\/Pièce jointe] # n'a pas résolu le problème. Merci de votre aide. – Mark

0

Je pense que je résous cela. Mes données de test dans l'exemple étaient mauvaises, alors j'essayais de faire correspondre un pattern invalide.