He intentado reemplazar php pero cambia todo lo que ocurre. Solo quiero mach exacto y dividir | y +
$menu='home|about|product+service+able|contact|ab|'; echo str_replace("ab","book",$menu);Resultado:
$result ='home|about|product+service+abel|contact|book|';O si ejemplo 2
$menu2='home|about|product+service+ab|contact|able|';resultado2
$result ='home|about|product+service+book|contact|able|';Debe usar la expresión regular para capturar 'ab' al principio y al final de la cadena https://www.php.net/manual/ro/function.preg-replace.php vea el código a continuación con algunos casos de prueba
<?php $menu='home|about|product+service+able|contact|ab|'; $menu1='home|about|product+service+able|contact|ab'; $menu2='ab|about|product+service+able|contact|abx|'; $menu3='home|ab|product+service+able|contact|abx'; $menu4='home|about|product+service+ab|contact|able|'; $pattern = array('/^ab([|+])/', '/([|+])ab([|+])/', '/([|+])ab$/'); $replacement = array('book${1}', '${1}book${2}', '${1}book'); echo preg_replace($pattern, $replacement, $menu); echo "\n"; echo preg_replace($pattern, $replacement, $menu1); echo "\n"; echo preg_replace($pattern, $replacement, $menu2); echo "\n"; echo preg_replace($pattern, $replacement, $menu3); echo "\n"; echo preg_replace($pattern, $replacement, $menu4); echo "\n"; ?>producción
home|about|product+service+able|contact|book| home|about|product+service+able|contact|book book|about|product+service+able|contact|abx| home|book|product+service+able|contact|abx home|about|product+service+book|contact|able|Como nadie ofreció una solución sin expresiones regulares, aquí está la mía:
<?php // Some Configuration $searchFor = 'ab'; $replaceWith = 'book'; // Sample data $menu = 'home|about|product+service+able|contact|ab|'; // Actual code $array = explode('|', $menu); $resultArray = []; foreach ($array as $string) { if ($string === $searchFor) { $resultArray[] = $replaceWith; } else { $resultArray[] = $string; } } $result = implode('|', $resultArray); echo $result; // home|about|product+service+able|contact|book|Podrías hacer algunas optimizaciones, pero para facilitar la comprensión lo dejé como está.
Actualización: si también desea poder dividir entre + , también use lo siguiente.
<?php function customSplit($var, $searchFor, $replaceWith) { $array = explode('|', $var); $resultArray = []; foreach ($array as $string) { $tmpResult = []; foreach (explode('+', $string) as $tmpString) { if ($tmpString === $searchFor) { $tmpResult[] = $replaceWith; } else { $tmpResult[] = $tmpString; } } $resultArray[] = implode('+', $tmpResult); } return implode('|', $resultArray); } // Some Configuration $searchFor = 'ab'; $replaceWith = 'book'; // Sample data $menu = 'home|about|product+service+able|contact|ab|'; $menu2 = 'home|about|product+service+ab|contact|able|'; echo customSplit($menu, $searchFor, $replaceWith); // home|about|product+service+able|contact|book| echo customSplit($menu2, $searchFor, $replaceWith); // home|about|product+service+book|contact|able|Busque cualquier ab que no esté precedido o seguido por un carácter en el rango az .
Por lo tanto, necesita una mirada negativa hacia atrás para az: (?<![az])
y una mirada negativa hacia el futuro para az : (?![az])
con ab en el medio
expresión regular: (?<![az])ab(?![az])
Y en php:
$pattern = '/(?<![az])ab(?![az])/'; $result = preg_replace($pattern,'book',$yourstring);