2010-06-21 7 views
0

J'utilise un analyseur ubb pour convertir plusieurs codes entre parenthèses en codes html. Je veux utiliser un substitut de chaîne pour remplacer certains mots indésirables.Remplacer les mots - Ignorer les mots entre parenthèses

Maintenant, j'utilise ceci:

foreach($f AS $value) { 
      $escapeNamesArray[] = '/'.$value['woord'].'/i'; 
      $escapeNamesReplace[] = '<span style="color: gray;">'.$value['vervanging'].'</span>'; 
     } 

     $string = preg_replace($escapeNamesArray, $escapeNamesReplace, $string); 

Quand je veux remplacer le mot « Bonjour » à « Hey », tout fonctionne bien. Mais quand je mets le mot « Bonjour » entre parenthèses, par exemple:

[url = http://www.hello.com]kdskdsds[/url]

Le mot « Bonjour » est remplacé aswell. Comment puis-je changer le modèle de la fonction preg_replace pour ignorer les mots entre parenthèses?

Merci pour votre réponse!

Répondre

0

Je vous recommande de prendre chaque variable et de la diviser au niveau de la parenthèse d'ouverture et de fermeture. S'il est divisé sur le support ouvert, vous savez qu'il contient un support d'ouverture. Appelez le remplacement sur la chaîne à gauche du crochet ouvert (appelez var1). Ensuite, appelez split sur le crochet de fermeture et vous savez que la chaîne à gauche est le contenu du crochet, donc concaténez-le en var 1 (appelé var2). Ensuite, appelez replace à la chaîne à la droite de la dernière division car elle doit être en dehors du crochet de fermeture et concaténer le résultat à var2.

Exemple:

$exampleStr = "[url=http://www.hello.com]kdskdsds[/url]"; 
$piecesOfString = explode("[", $exampleStr); 
// $piecesOfString[0] = "" --> before the opening bracket so if there was anything there you would have to replace 
// $piecesOfString[1] = "url=http://www.hello.com]kdskdsds" 
// $piecesOfString[2] = "/url]";" 

$piecesOfStringSecond = explode("]", $piecesOfString[1]); 
// $piecesOfStringSecond[0] = "url=http://www.hello.com" within the brackets so don't replace 
// $piecesOfStringSecond[1] = "kdskdsds" //outside bracket so replace 


$piecesOfStringSecond = explode("]", $piecesOfString[2]); 
// $piecesOfStringSecond[0] = "/url" within the brackets so don't replace 
// $piecesOfStringSecond[1] = "" //outside bracket so if length > 0 replace 

Je n'ai pas vérifié et je te donne ceci dans pseudocode mais:

$exampleStr = "begin[url=http://www.hello.com]kdskdsds[/url]between[url=http://www.second.com]dsfafa[/url]between2[url=http://www.third.com]kjhjkhk[/url]end"; 
$piecesOfStringOpen = explode("[", $exampleStr); //splits the string at the "[" 
for integer j = 0 to length of $piecesOfStringOpen { 
    if (j == 0) { // you know it will be the first part "begin" 
     // call replace on $piecesOfStringOpen[j] because you know it is outside of brackets 
    } else { 
     //this will include: 
     // $piecesOfStringOpen[1] = "url=http://www.hello.com]kdskdsds" 
     // $piecesOfStringOpen[2] = "/url]between" 
     // $piecesOfStringOpen[3] = "url=http://www.second.com]dsfafa" 
     // etc 
     $piecesOfStringClose = explode("]", $exampleStr); //splits the string at the "]" 
     for integer k = 0 to length of $piecesOfStringClose { 
     //if k == 0 then it was inside bracket, is a url and don't replace 
     //elsif k == 1 then it was outside bracket and you want to replace 
     } 
    } 
} 
+0

Pourriez-vous me donner un petit exemple, parce que je ne sais pas exactement ce que vous voulez dire. – Arjen

+0

Quand j'ai un long texte avec plusieurs balises UBB, c'est une tâche très difficile de le faire à votre façon, n'est-ce pas? – Arjen

+0

Il peut y avoir un moyen plus simple, mais si vous êtes assuré qu'il n'y aura pas de parenthèses incorporées ou incompatibles, c'est ce que je vois. – Kyra

0

L'utilisation preg_replace souvent dans des situations Html ISH se transforme en une fosse de boue. Je vous recommande fortement de trouver une solution différente à ce problème.

Je suggère de laisser l'analyseur faire son travail en premier, en transformant tout en XHTML valide. Ensuite, utilisez quelque chose comme SimpleXMLElement ou DOMDocument pour analyser le document. Vous pouvez ensuite traverser l'objet en remplaçant les mauvaises chaînes dans chaque élément. Lorsque vous avez terminé, convertissez-le en une chaîne XHTML.

Cette solution est un peu plus complexe, mais elle est plus robuste et plus flexible, surtout si vous décidez d'ajouter plus de filtres et de remplacements plus tard.

+0

J'ai peur que ce soit trop rigoureux pour ma situation actuelle. Je n'utilise pas de DOMparser et quand c'est possible je voudrais le faire par un preg_replace de quelque chose comme ça. – Arjen

0

Lucas est juste, mais juste un simple changement à votre code existant:

Vous avez juste besoin d'ajouter assurez-vous que son seul correspondant à des mots directement entre []

Je viens d'ajouter [et ] dans votre tableau de modèles (vous devez les échapper car ils sont normalement utilisés pour un tableau de caractères regex).Voici le code mis à jour:

foreach($f AS $value) 
{ 
$escapeNamesArray[] = '/ '.$value['woord'].' /i'; 
$escapeNamesReplace[] = '<span style="color: gray;">'.$value['vervanging'].'</span>'; 
} 

$string = preg_replace($escapeNamesArray, $escapeNamesReplace, $string); 

C'est la seule en fait la ligne changé:

$escapeNamesArray[] = '/ '.$value['woord'].' /i'; 

Cela fonctionne avec [whatever][ whatever][whatever ] mais pas [ whatever ]

Je nai eu la chance de tester cette , mais ça devrait marcher.

EDIT: Modifiez le code un peu, s'il vous plaît prendre un autre regard: o)

+0

Je pense qu'ils essaient de faire exactement le contraire: seulement remplacer les correspondances qui se trouvent en dehors des balises BBCode. – erisco

+0

Merci pour votre réponse, mais je veux ignorer les mots entre les crochets, donc le contraire de votre message. – Arjen

+0

Mes excuses, encore une fois, je n'ai pas eu le temps de tester, mais le code édité ci-dessus devrait fonctionner – vimist

0

Vous pouvez utiliser la BBCode PECL extension pour faire le levage de charges lourdes pour vous. Vérifiez cela:

<?php 

function filterWords($content, $argument) { 

    $badWordList = array(
    'complex', 
    'regular expressions', 
    'O(n^2)' 
); 

    return str_ireplace($badWordList, '', $content); 
} 

$bbcodeParserConfig = array(
    '' => array(
       'type' => BBCODE_TYPE_ROOT, 
    'content_handling' => 'filterWords' 
), 
    'url' => array(
       'type' => BBCODE_TYPE_OPTARG, 
      'open_tag' => '<a href="{PARAM}">', 
      'close_tag' => '</a>', 
     'default_arg' => '{CONTENT}', 
       'childs' => '' 
) 
); 

$bbcodeParser = bbcode_create($bbcodeParserConfig); 

$content = 'This is a complex url that [url=http://www.example.com]tells you nothing about regular expressions or O(n^2) algorithms[/url] and thankfully so!'; 

var_dump(bbcode_parse($bbcodeParser, $content)); 

Il existe également un BBCode parser written in PHP.

Questions connexes