2010-06-08 7 views
2

Je suis en train d'utiliser str_replace, mais ne peut pas comprendre comment utiliser \ b pour limite de mot:php str_replace et b mot frontière

<?php 

$str = "East Northeast winds 20 knots"; 

$search = array("North", "North Northeast", "Northeast", "East Northeast", "East", "East Southeast", "SouthEast", "South Southeast", "South", "South Southwest", "Southwest", "West Southwest", "West", "West Northwest", "Northwest", "North Northwest"); 

$replace = array("N", "NNE", "NE", "ENE", "E", "ESE", "SE", "SSE", "S", "SSW", "SW", "WSW", "W", "WNW", "NW", "NNW"); 

$abbr = str_replace($search, $replace, $str); 

echo $abbr; 


// this example echoes "E Neast winds 20 knots" since \b word boundary is not used 
// how to apply word boundary so that is seeks the exact words to replace? 
// the text to replace could be anywhere (start, middle, end) of string 
// this example should output "ENE winds 20 knots" 

?> 

Répondre

1

Ne vous embêtez pas avec les regexes, il suffit de commander votre chaînes de remplacement dans un ordre qui remplace les plus premier:

$search = array("North Northeast", "East Northeast", "East Southeast", "South Southeast", "South Southwest", "West Southwest", "West Northwest", "North Northwest", "Northeast", "SouthEast", "Southwest", "Northwest", "North", "East", "South", "West"); 

$replace = array("NNE", "ENE", "ESE", "SSE", "SSW", "WSW", "WNW", "NNW", "NE", "SE", "SW", "NW", "N", "E", "S", "W"); 

echo str_replace($search, $replace, "East Northeast winds 20 knots"); 

// Output: ENE winds 20 knots 

de cette façon, vous n'avez pas à vous soucier de East être remplacé avant East Southeast.

+0

Merci beaucoup! Fonctionne comme un charme ... – Barry

+0

@Barry, ne pas oublier de marquer la réponse acceptée alors :) –

2

Vous ne pouvez pas utiliser \ b avec str_replace(). La limite de mot "\ b" est seulement une ancre valide dans les expressions régulières. Donc, utiliser preg_replace(), il est plus approprié si votre texte de recherche contiennent le langage naturel:

$replace = array_combine($search, $replace); 
preg_replace('#\b('.implode('|',$search).')\b#e', '$replace["$1"]?:"$1"', $str) 

Sinon tout occourence de « E » dans le texte va obtenir remplacé par « l'Est ». Comme solution de rechange, vous pouvez au moins ajouter un espace droit à vos chaînes $ search et $ replace.