Si hay una función PHP como ucfirst () que ignorará html?

Estoy progtwigndo la gramática básica en comentarios y otro contenido enviado por el usuario. Capitalizando I, la primera letra de la oración, etc. Los comentarios y el contenido se mezclan con HTML ya que los usuarios tienen algunas opciones para formatear su texto.

En realidad, esto es un poco más desafiante de lo esperado, especialmente para alguien nuevo en PHP y regex.

Si hay una función como ucfirst que ignorará html para ayudar a escribir en mayúsculas las oraciones?

Además, cualquier enlace o tutorial sobre la limpieza de texto como este en html, sería apreciado. Por favor, deje todo lo que sienta que ayudaría en los comentarios. ¡Gracias!

EDITAR: Texto de muestra:

i wuz walkin thru the PaRK and found ur dog.
i hoPe to get a reward.
plz call or text 7zero4 8two8 49 sevenseven

Necesito que sea (en última instancia)

 

I was walking through the park and found your dog.

I hope to get a reward.

Please call or text (704) 828-4977.

Sé que esto va un poco más allá de la pregunta prevista, pero mi pensamiento era hacer esto de forma incremental. ucfirst () es solo una de las muchas funciones que estaba usando para hacer una pequeña limpieza a la vez por escaneo. Incluso si tuviera que ejecutar el texto 100 veces a través del filtro, esto se ejecuta en una ejecución de cron cuando el sitio no tiene tráfico. Ojalá hubiera un foro de discusión donde esto podría continuar, ya que obviamente habría algunas buenas ideas para continuar el enfoque. Cualquier pensamiento sobre cómo abordar esto como un proyecto general, de todos modos, por favor deje un comentario.

Supongo que en el espíritu de la pregunta en sí. ucfirst, entonces, no sería la mejor función para esto, ya que no podría tomar una lista de argumentos de cosas que ignorar. ¡Una bandera IGNORE_HTML sería genial!

Dado que se trata de una pregunta de PHP, el analizador DOM recomendado a continuación parece ser la mejor respuesta. ¿Pensamientos?

Probablemente deberías usar un analizador DOM (ya sea el integrado o, por ejemplo, este , que es realmente fácil de usar).

Recorra todos los nodos de texto en su HTML y realice la limpieza con preg_replace_callback , ucfirst y una expresión regular como esta:

 '/(\s*)([^.?!]*)/' 

Esto coincidirá con una cadena de espacios en blanco y, a continuación, con tantos caracteres que no sean de puntuación de final de oración como sea posible. La oración real (comenzando con una letra, a menos que la oración comience con " , lo que complica un poco las cosas) se encontrará en el primer grupo de captura.

Pero a partir de su pregunta, supongo que ya está haciendo algo como esto último y su código simplemente se está ahogando en las tags HTML. Aquí hay un código de ejemplo para obtener todos los nodos de texto con el segundo analizador DOM vinculado:

 require 'simple_html_dom.php'; $html = new simple_html_dom(); $html->load($fullHtmlStr); foreach($html->find('text') as $textNode) $textNode = cleanupFunction($textNode); $cleanedHtmlStr = $html->save(); 

También puede agregar un pseudo-elemento CSS a sus elementos deseados de esta manera:

 div:first-letter { text-transform: uppercase; } 

Pero probablemente necesite cambiar el camino, imprima sus sentencias (si las está imprimiendo todas en una etiqueta enorme), ya que CSS no tiene la capacidad de detectar el comienzo de una nueva oración dentro de una sola etiqueta 🙁

En html será muy difícil de hacer, ya que estarás construyendo algún tipo de analizador html. Mi sugerencia sería limpiar el texto antes de que se transforme en html, en el momento en que lo saque de la base de datos. O mejor aún, limpie la base de datos una vez.

Esto debería hacerlo:

 function html_ucfirst($s) { return preg_replace_callback('#^((<(.+?)>)*)(.*?)$#', function ($c) { return $c[1].ucfirst(array_pop($c)); }, $s); } 

Convierte

  • foo a Foo ,
  • test

    a

    Test

    ,

  • pero también bar a Bar .

Editar: de acuerdo con su pregunta detallada, es probable que desee aplicar esta función a cada oración. Tendrá que analizar el texto primero (por ejemplo, dividir por períodos).