He estado tratando de poner en negrita un término de búsqueda en una oración. Si la oración es Engliš is spoken wörldwide. Si mi término de búsqueda es spoken world , quiero que Engliš is <b>spoken wörld</b>wide.
He usado esta función:
function highlightWords($text, $searchTerm){ $corr = ['a' => '[aäâ]', 'o' => '[oöòóôõ]', 'c' => '[cç]', 's' => '[şśšșŝ]', 'y' => '[ýÿŷȳy]', 'o' => '[ôöòóøōoõ]', 'n' => '[ñńňn]', 'u' => '[üu]']; $key = preg_quote($searchTerm); $pattern = '/' . strtr($key, $corr) . '/iu'; $text = preg_replace($pattern, '<b>$0</b>', $text); return $text; }Se supone que funciona, pero tengo un comportamiento realmente extraño. Algunos ejemplos son:
El texto es Sygmaý çykdy deşdi-sähra düzünden (perdón por la extraña oración). Cuando $searchTerm es duz , funciona perfectamente, obtengo Sygmaý çykdy deşdi-sähra <b>düz</b>ünden . Si cambio el término de búsqueda a sahra , la función devuelve simplemente Sygmaý çykdy deşdi-sähra düzünden .
Funciona con cykdy y çykdy .
Pero no funciona ni con sygmay ni con sygmaý . Pero trabaja con Sygmaý con mayúscula.
¿Qué debo corregir para obtener el término de búsqueda resaltado en todos los escenarios?
Hay un par de problemas en la función, específicamente en la matriz $corr .
Primero, hay dos secciones "o" y son diferentes. Esos necesitan ser combinados. En segundo lugar, la letra sin acento debe estar en la matriz de cada letra. s no tiene esto, la "s" que falta es lo que está causando esta falla en particular.
Función fija:
function highlightWords($text, $searchTerm) { $corr = [ 'a' => '[aäâ]', 'o' => '[oöòóôõøō]', 'c' => '[cç]', 's' => '[sşśšșŝ]', 'y' => '[yýÿŷȳ]', 'n' => '[nñńň]', 'u' => '[uü]' ]; $key = preg_quote($searchTerm); $pattern = '/' . strtr($key, $corr) . '/iu'; $text = preg_replace($pattern, '<b>$0</b>', $text); return $text; } $input = 'Sygmaý çykdy deşdi-sähra düzünden'; $term = 'sahra'; $expected = 'Sygmaý çykdy deşdi-<b>sähra</b> düzünden'; $highlighted = highlightWords($input, $term); assert($highlighted == $expected, 'Term should be marked bold'); echo $highlighted . PHP_EOL;