2010-03-22 5 views
1

Je ne suis pas très ferme avec preg_replace - en d'autres termes, je ne comprends pas vraiment - alors j'espère que vous pouvez m'aider.preg_replace Pattern

J'ai une chaîne dans un texte comme celui-ci: [demo category=1] et que vous voulez remplacer par le contenu de la catégorie (id = 1) par ex. "This is the Content of my first Category"

Ceci est mon startpoint Pattern - c'est tout ce que j'ai: '/[demo\s*.*?]/i';

Espoir vous pouvez aider?

+0

Voulez-vous dire que vous voulez remplacer la chaîne "[demo category = 1]" par "Content of Category (id = 1)"? –

+0

j'ai par exemple. un tableau avec $ content [0] = 'Ceci est Nr.1' et $ content [1] = 'Ceci est Nr.2 '- maintenant je veux remplacer [demo category = 1] avec $ content [$ categoryid] – codeworxx

Répondre

1

Tout d'abord, vous devez échapper aux crochets car ils sont des caractères spéciaux dans PCREs:

'/\[demo\s*.*?\]/i'; 

Deuxièmement, il semble que vous voulez faire quelque chose avec le chiffre à la fin, donc vous aurez envie de le capturer en utilisant des parenthèses:

'/\[demo\s*.*?=(\d+)\]/i'; 

Les accolades capturer \d+ et de le stocker dans une référence. \d+ correspond à une chaîne de nombres uniquement.

Enfin, il semble que vous devez utiliser preg_replace_callback pour exécuter une fonction spéciale sur les matchs afin d'obtenir la chaîne que vous voulez:

function replaceMyStr($matches) 
{ 
    $strNum = array("1"=>"first", "2"=>"second", "3"=>"third"); // ...etc 
    return "This is the Content of my ".$strNum($matches[1])." Category."; 
    // $matches[1] will contain the captured number 
} 
preg_replace_callback('/\[demo\s*.*?=(\d+)\]/i', "replaceMyStr", "[demo category=1]"); 
0

Le modèle va être comme ça

/\[demo\s+category=(\d+)\]/i' 

(dont vous avez besoin pour échapper à crochets parce qu'ils sont spéciaux)

0

Les caractères [ et ] ont une signification particulière (ils représentent des classes de caractères - gammes et des collections de caractère). Vous devez échapper [ comme \[ (et évidemment en PHP, contrairement à d'autres saveurs regex, vous devez également échapper à ]). Aussi je vous suggère de faire usage de la classe de caractères [^]] = correspond à tout caractère qui n'est pas ]

/\[demo\s+[^]]*\]/i 

devrait fonctionner mieux.

Edit: Si vous voulez extraire le nom et le numéro, vous pouvez utiliser

/\[demo\s+(\w+)\s*=\s*(\d+)\]/i 
+0

Vous devez vous échapper]. ;) – user187291

+0

Huh. En effet, RegexBuddy le suggère. Il le fait aussi, pour d'autres saveurs où ce n'est définitivement pas nécessaire (comme Python). Je pense que RegexBuddy est trop prudent ici. Je ne l'ai pas essayé avec PHP - ça ne marche pas quand ']' n'est pas échappé? –

+0

Cela fonctionne, mais doit encore être échappé pour des raisons de lisibilité. – user187291

1

suite aux réponses ci-dessus, vous avez 2 façons de le faire le remplacement effectif. en supposant que vous avez 10 noms de catégories que vous souhaitez remplacer, vous pouvez faire quelque chose comme

for ($i = 1; $i <= $max_category; $i++) { 
$category_name = get_category_name($i); 
$s = preg_replace("/\[demo\s+category=(\d+)\]/i", $category_name, $s); 
} 

ou

$s = preg_replace_callback("/\[demo\s+category=(\d+)\]/i", "get_category_name", $s); 

dans les deux cas, get_category_name ($ id) est une fonction qui obtenir un nom de catégorie pour un identifiant vous devriez tester les deux options pour évaluer ce qui est le plus rapide pour vos utilisations.