2010-10-31 3 views
2

Je suis sûr que quelqu'un a déjà posé cette question, mais après avoir cherché plus de 1 heure sur google, j'ai décidé de poser ma question ici.question Preg match

Je souhaite parcourir un tableau contenant des chaînes/textes différents. Ces textes contiennent des chaînes à la fois ## valuetoreplace ## et # valuetoreplace #

Je veux faire à preg_matches:

$pattern = '/^#{1}+(\w+)+#{1}$/'; 
if(preg_match($pattern, $value, $matches, PREG_OFFSET_CAPTURE)) 
{ 
    // do something with the #values# 
} 

ET

$pattern = '/^#{2}+(\w+)+#{2}$/'; 
if(preg_match($pattern, $value, $matches, PREG_OFFSET_CAPTURE)) 
{ 
    //do something with the ##value## 
} 

Cela fonctionne très bien. Maintenant, mon seul problème est la suivante:

Quand j'ai une chaîne comme

$valueToMatch = 'proceding text #value#'; 

Mon preg_match Je ne trouve pas plus ma valeur (comme je l'ai utilisé un^et $). Question: comment puis-je trouver le #value# et le ##value##, sans avoir à s'inquiéter si ces mots sont au milieu d'une valeur (multiligne)?

* En outre: Ce que je veux est de trouver des modèles et remplacer le # valeur # avec une valeur de DB et un ##value## avec une valeur de tableau. Par exemple:

$thingsToReplace = 'Hello #firstname# #lastname#, 
How nice you joined ##namewebsite##.'; 

devrait être

'Hello John Doe, 
How nice you joined example.com.' 
+0

Que voulez-vous dire par * sans avoir à vous inquiéter si ces mots sont au milieu d'une valeur (multiligne) *? Est-ce que vous * voulez * trop de lignes ou pas? –

Répondre

1

Essayez ceci: /##([^#]+)##/ et /#([^#]+)#/, dans cet ordre.

+0

J'ai déjà essayé celui-ci. Le seul problème est. Dans ce cas, ## value ## est correct aussi !, car # value # fait partie de [#] # value # [#] – Arthur

+2

Dans ce cas, exécutez l'expression rationnelle qui remplace '## valuetoreplace ##' * en premier * pour que ceux-là soient tous partis, et * ensuite * exécute l'expression rationnelle qui remplace '# valuetoreplace #'. Si vous le faites dans cet ordre, vous n'aurez pas le problème que vous avez décrit ci-dessus, car toutes les instances de '## valuetoreplace ##' auront disparu. – Asaph

+0

C'est une bonne idée. Merci Asaph – Arthur

0

Peut-être bien de savoir pour les autres visiteurs comment je l'ai fait:

foreach($personalizeThis as $key => $value) 
{ 
    //Replace ##values## 
    $patternIniData = '/#{2}+(\w+)#{2}/'; 
    $return = 'website'; //testdata 
    $replacedIniData[$key] = preg_replace($patternIniData, $return, $value); 

    //Replace #values# 
    $pattern = '/#{1}+(\w+)#{1}/'; 
    $return = 'ASD'; //testdata 
    $replacedDbData[$key] = preg_replace($pattern, $return, $replacedIniData[$key]); 
} 

retour replacedDbData de $;