Recibo un error al usar la función php str_replace. Estoy leyendo una cadena en un archivo diferente a JSON y si elimino la parte str_replace, funciona sin el error, pero quiero que la ** se ponga en negrita si hay otras formas de saber que también puedes decirlo.

<?php
  $data = json_decode($readjson, true);
  echo "<br/><br<br/>";
  foreach ($data as $emp) {
    echo str_replace("**","<strong>","$data"), $emp['message']."<br/>";
  }
?>    

Y la salida es

Aviso: conversión de matriz a cadena en C: \ Users \ k-ver \ Dropbox \ Other \ website stuff o smth \ r3mind3r \ changelog.php en la línea 16 Array - Actualización de Weekley - ¡Otra gran semana a nuestro lado! Hemos realizado enormes avances en la sincronización con el raspberry pi (la computadora desde la que vamos a alojar) y estamos más cerca que nunca de nuestro lanzamiento prometido. También hemos estado arreglando los comandos de silencio y estamos muy cerca para hacerlo funcionar, también con la función de comando de silencio. También creamos un nuevo sistema que debería ser más fácil de usar para los desarrolladores y traductores. Todo lo que queda para el lanzamiento del cajero automático es: -finar la sincronización -ajustar el comando de silencio y el comando de silencio -hacer un sistema de nivel permisson en funcionamiento -añadiendo los últimos 30% del bot que no tiene el sistema de traducción en su lugar . ¡y el bot tendrá su gran lanzamiento! (sobre el tiempo si me preguntaste)

(es para un registro de desarrollo)

Y la parte que no entiendo es el aviso y tampoco entiendo cómo solucionarlo. Sería genial si ustedes quisieran ayudarme.

0
Woof Fighter 8 sep. 2018 a las 18:09

4 respuestas

La mejor respuesta

Esta variable debe ser un valor de cadena, por ejemplo, $emp['message'] no la matriz multidimensional $data.

// see this line with $emp['message'] not $data array
str_replace("**","<strong>",$emp['message']);

EDITAR: según el comentario

<?php
$string = '{
"188762891137056769": {
"message": "\n**- Weekley Update -**\nAnother great week at our side! \nWe have made enournous advances in synching with the raspberry pi *(the computer we are going to host from)* and are closer than ever to our promised release\n\nWe have also been fixing on the mute commands and are very close to making it work, aswell with unmute command.language feature is closing \nup on complete and about 70% of the bot has the language system working. We also made a new system that should be easier to use for bouth \nus devs and the translators.\n\n**All thats left for the release atm is:**\n-finishing synching \n-fixing the mute command and unmute command \n-make a functioning permissonlevel system\n-adding those last 30% of the bot that does not have the translationsystem in place. \n\nand the bot will have its huge release! *(about time if you asked me)*"
}
}';
$array = json_decode($string,1);
$message = $array['188762891137056769']['message'];
$re = '/\*\*(.*?)\*\*/m';
$subst = '<strong>$1</strong>';
echo preg_replace($re, $subst, $message);
?>

DEMO: https://3v4l.org/ovhGq

0
Always Sunny 8 sep. 2018 a las 15:40

Tu código es:

foreach ($data as $emp) {
    echo str_replace("**","<strong>","$data"), $emp['message']."<br/>";
}

Verá que $ data es una matriz, un $ emp es el elemento actual dentro del bucle foreach. Entonces, debes hacer: str_replace ("", "", $ emp )

Por cierto, veo esto: $ emp ['mensaje'] , lo que significa que $ emp también es una matriz. Tal vez debería publicar la variable $ readjson, para que sepamos qué tipo de datos es.

0
Aberel 8 sep. 2018 a las 15:25

Si desea encerrar el texto entre ** con <strong></strong>, debe usar una expresión regular. Aquí hay un pequeño código que hace lo que quieres:

function boldify($text) {
    return preg_replace('/\*\*((.|\n|\r)*)\*\*/imU', '<strong>$1</strong>', $text);
}

Básicamente, utiliza la función preg_replace para reemplazar de acuerdo con la expresión regular (el primer parámetro).

Cómo funciona esta expresión regular:

1) Tienes \*\* al principio porque esa es tu "etiqueta de apertura". (* es un carácter regex especial, por lo que necesita escapar).

2) Tienes ((.|\n|\r)*).
La parte interna: .|\n|\r dice "Atrápame cualquier carácter (el.) O (el |) un avance de línea (el \ n) o un retorno de carro (el \ r)".
Entonces tienes la parte interna encerrada con (inner part)*. Esto dice "Haga coincidir la parte interior cualquier cantidad de tiempo".
Finalmente, tiene la "parte media" encerrada con (middle part). Esto dice "Recuerda lo que acabas de atrapar entre paréntesis, lo necesitaremos para reemplazarlo.

3) Tienes \*\* nuevamente.

4) Todo esto está encerrado por /regex/imU.
Los / están ahí para decir dónde está realmente la expresión regular.
Las imU son banderas: i ignora mayúsculas y minúsculas, m multilínea, U no greedy.
Soy m son bastante sencillos, pero U dice "atrapar al grupo más pequeño posible".

Como segundo parámetro tienes '<strong>$1</strong>'. $ 1 es el grupo que recordamos de 2).

El tercer parámetro es el sujeto.

Espero que haya quedado claro.

Puedes usarlo así:

echo boldify($emp['message']);
0
Alex van Vliet 8 sep. 2018 a las 15:43

Usó la matriz dentro de str_replace ("**", "", "$ data") esto está mal, cómo puede solucionarlo simplemente reemplace $ data con $ emp

0
ZoOoM 8 sep. 2018 a las 15:22