PHP para poner en mayúsculas todas las letras (incluso después de una barra oblicua) a excepción de ciertas palabras

Quiero usar PHP para limpiar algunos títulos con mayúsculas en cada palabra, incluidas las que siguen a una barra inclinada. Sin embargo, no quiero usar mayúsculas en las palabras 'y', 'de' y 'el'.

Aquí hay dos cadenas de ejemplo:

tecnología contable/técnico y teneduría de libros

cirugía ortopédica de la columna vertebral

Debe corregir a:

Tecnología Contable / Técnico y Contabilidad

Cirugía Ortopédica de la Columna Vertebral


Esto es lo que tengo actualmente. No estoy seguro de cómo combinar la implosión con preg_replace_callback.

// Will capitalize all words, including those following a slash
$major = implode('/', array_map('ucwords',explode('/',$major)));

// Is supposed to selectively capitalize words in the string
$major = preg_replace_callback("/[a-zA-Z]+/",'ucfirst_some',$major);

function ucfirst_some($match) {
   $exclude = array('and','of','the');
   if ( in_array(strtolower($match[0]),$exclude) ) return $match[0];
   return ucfirst($match[0]);
}

En este momento, escribe en mayúsculas todas las palabras de la cadena, incluidas las que no quiero.

preguntado el 31 de diciembre de 12 a las 16:12

¿Qué pasa con las palabras "en", "sobre", "en", etcétera? -

¿Preposiciones y artículos? Claro... Supongo que no es necesario que sea tan completo. En este momento está capitalizando todo, pero quiero que excluya varias palabras en una matriz. -

@MattiVirkkunen Estoy seguro de que Jon puede agregar elementos a la matriz de exclusión si lo desea, el código simplemente pondrá en mayúscula la palabra 'innecesariamente'. Deja de molestarlo con este artículo irrelevante. -

El punto es que no sé cómo combinar las mayúsculas de las palabras que siguen a las barras y la EXCLUSIÓN de ciertas palabras. El código publicado no hace lo que yo quiero. -

@Sammitch: No es irrelevante. Aprender a describir problemas de manera concisa y precisamente es muy importante en nuestro campo. -

2 Respuestas

Bueno, iba a intentar una llamada recursiva a ucfirst_some(), pero su código parece funcionar bien sin la primera línea. es decir:

<?php
$major = 'accounting technology/technician and bookkeeping';
$major = preg_replace_callback("/[a-zA-Z]+/",'ucfirst_some',$major);
echo ucfirst($major);

function ucfirst_some($match) {
   $exclude = array('and','of','the');
   if ( in_array(strtolower($match[0]),$exclude) ) return $match[0];
   return ucfirst($match[0]);
}

Imprime lo deseado Accounting Technology/Technician and Bookkeeping.

Su expresión regular ya coincide con cadenas de letras, no parece que tenga que preocuparse por las barras en absoluto. Solo tenga en cuenta que un número o símbolo [como un guión] en medio de una palabra también provocará el uso de mayúsculas.

Además, haga caso omiso de las personas que insisten en usted acerca de su $exclude Si la matriz no es lo suficientemente completa, siempre puede agregar más palabras a medida que las encuentre. O simplemente Google para una lista.

Cabe señalar que no existe una forma "correcta" única y acordada para determinar qué debe/no debe capitalizarse de esta manera.

Respondido 13 Abr '17, 13:04

¡Perfecto! Gracias por la ayuda. La matriz de exclusión es una lista finita de las únicas palabras en mi base de datos... es por eso que no sentí la necesidad de complicar demasiado las cosas. Tengo una lista completa de palabras vacías si quisiera usarla; solo estaba ignorando lo que decían antes porque no era pertinente al problema. - Jon

+1, por no ver la necesidad de molestar al OP sobre las diversas permutaciones de palabras de exclusión. - davidethell

@Jon donlaur planteó un buen punto sobre las cadenas que comienzan con una palabra 'excluida'. simplemente he añadido ucfirst($major) para abordar esto. Salud. - Sammitch

También querrás asegurarte de que las palabras como an y the se usen al comienzo de una oración y que estén todas en mayúsculas.

Nota: No puedo pensar en ningún término como este que comience con de o y al principio, pero es más fácil arreglar cosas como esa antes de que se introduzcan datos extraños en su programa.

Hay un fragmento de código que he usado antes en http://codesnippets.joyent.com/posts/show/716

Se hace referencia en la página de funciones de php.net para ucwords en la sección de comentarios http://php.net/manual/en/function.ucwords.php#84920

Respondido el 31 de diciembre de 12 a las 16:12

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.