2010-09-24 15 views
1

comment puis-je enlever tous les espaces blancs et  ?preg_replace: comment supprimer tous les espaces blancs et  ?

J'ai cela comme une entrée dans un emballage je crée,

[b]       bold       [/b]

donc avant de mettre le texte en gras, je veux dépouiller tous les espaces blancs et & nbsp, et la transformer en [b]bold[/b] ,

$this->content = preg_replace("/\[(.*?)\]\s\s+(.*?)\s\s+\[\/(.*?)\]/", 
       "[$1]$2[/$3]", 
       $this->content); 

mais cela ne fonctionne pas! Pouvez-vous aider s'il vous plaît?

+0

Le problème est simplement que php ne reconnaît pas ''   comme un caractère d'espace blanc, simplement parce qu'il est enfait juste une chaîne de 6 personnages.Si vous voulez utiliser des regexps pour cela, vous devrez indiquer à php de faire correspondre explicitement ' '. – poke

+0

où obtenez-vous ces ' '? peut-être ne pas l'ajouter du tout? –

Répondre

3

J'ai trouvé une autre solution

$this->content = preg_replace("/\[(.*?)\]\s*(.*?)\s*\[\/(.*?)\]/", "[$1]$2[/$3]", html_entity_decode($this->content)); 
6

Il n'y a pas besoin d'une solution basée sur regex. Vous pouvez simplement utiliser str_replace comme:

$input = "[b]       bold       [/b]"; 
$input = str_replace(array(' ',' '),'',$input); 
echo trim($input); // prints [b]bold[/b] 
+2

Cela supprimera également les espaces en dehors de '[b]'. Mais je ne sais pas si c'est un comportement attendu ou non. – NikiC

+0

En regardant son échantillon entrée/sortie ressemble à ce qu'il veut. – codaddict

+0

Sauf que l'échantillon n'affiche pas de texte en dehors des tags. – poke

1

Vous pouvez simplement remplacer les espaces vides avec des chaînes, par exemple

preg_replace("/(?:\s| )+/", "", $this->content, -1) 

Le -1 provoque le remplacement pour atteindre chaque instance de la correspondance.

1
$this->content = preg_replace(
    '~\[(.*?)](?:\s| )*(.*?)(?:\s| )*\[/\\1]/', 
    '[$1]$2[/$1]', 
    $this->content 
); 
+0

Cela ne fonctionnerait pas non plus. La question initiale n'a pas montré les caractères ' ' que OP veut supprimer. Votre solution ne fonctionnera pas du tout, puisque les crochets ne sont pas échappés, et tout votre groupement n'aide pas non plus. – poke

+0

@poke: Je ne comprends pas ce que vous voulez dire. Le carré de fermeture ']' n'a pas besoin d'être échappé. Tout ce que j'ai fait était de prendre l'expression rationnelle OPs, supprimer les parties inutiles et ajouter la reconnaissance de ' '. – NikiC

+0

@nikic: Hein? Avez-vous changé votre réponse entre les deux? – poke

0

Pour vous donner une solution complète avec des expressions régulières ainsi:

$this->content = preg_replace('/\[([a-z]+)\](?: |\s)*(.*?)(?: |\s)*\[\/([a-z]+)\]/', '[$1]$2[/$3]', $this->content); 

Mais dans ce cas, vous devriez plutôt combiner la suppression des espaces et la transformation bbcode pour vous assurer que les balises sont correctement:

$this->content = preg_replace('/\[b\](?:&nbsp;|\s)*(.*?)(?:&nbsp;|\s)*\[\/b]/', '<b>$2</b>', $this->content); 
+0

merci beaucoup! C'est ce que je veux! Merci! :-)))) – laukok

0

Une autre méthode qui fonctionnerait est:

$this->content = trim(str_replace('&nbsp;','',$this->content)); 

liens Manuel PHP:

trim() http://us.php.net/trim

* Note: Ceci suppose $ this-> contenu contient la chaîne affichée par OP

1

Un peu tard pour répondre, mais j'espère aider quelqu'un d'autre. La chose la plus importante lors de l'extraction du contenu de html est d'utiliser utf8_decode() en PHP. Alors toutes les autres opérations de cordes deviennent un jeu d'enfant. Même les caractères étrangers peuvent être remplacés en copiant directement les caractères du navigateur dans le code php.

La fonction suivante remplace &nbsp; par un caractère vide. Ensuite, tous les espaces blancs sont remplacés par des caractères vides en utilisant preg_replace().

function clean($str) 
{  
    $str = utf8_decode($str); 
    $str = str_replace("&nbsp;", "", $str); 
    $str = preg_replace("/\s+/", "", $str); 
    return $str; 
} 

$html = "[b] &nbsp; &nbsp; &nbsp; bold &nbsp; &nbsp; &nbsp; [/b]"; 
$output = clean($html); 
echo $output; 

[b] gras [/ b]