2010-12-31 15 views
6

Estoy tratando de crear una característica de estilo de código corto de Wordpress en PHP para reemplazar códigos cortos como "[[133]]" con imágenes. Básicamente, tengo una tabla MySQL de URL/títulos/subtítulos de imagen con ID 1-150, y quiero poder insertarlos dinámicamente en el texto de mis páginas con códigos abreviados como este:Cómo crear una función de estilo de código corto de Wordpress en PHP

Blabla bla bla bla bla. [[5]] Además, bla bla bla bla bla [[27]] ¡Hola, y bla bla bla! [[129]]

Por lo tanto, sólo quiero agarrar el ID como $ ID y, a continuación, darle de comer a una consulta MySQL como mysql_query ("SELECT título, subtítulo, la URL de imágenes donde id = $ id") y luego reemplace "[[id]]" con img/título/subtítulo. Me gustaría poder hacer esto varias veces en la misma página.

Sé que esto tiene que implicar regex y una combinación de preg_match, preg_replace, strstr, strpos, substr ... pero no sé por dónde empezar y qué funciones debería usar para hacer qué cosas. ¿Puedes recomendar una estrategia? No necesito el código en sí, solo saber qué usar para qué partes serían extremadamente útiles.

+0

Nota: esto NO es para un sitio de Wordpress, por lo que no puedo usar las funciones de código abreviado de WP existentes. – supertrue

+0

¿Quizás esto también involucre preg_replace_callback? – supertrue

+0

Me aventuraría a adivinar y decir que probablemente podría extraer el código relacionado de WordPress con la suficiente facilidad. Alternativamente, puede hacer lo que sugirió Kyle y usar uno de los muchos enfoques para crear su propia solución. –

Respuesta

4

Con una función getimage($id) que hace la consulta MySQL y da formato al texto de reemplazo, esto casi hace todo lo necesario:

$text = "Blabla [[5]] and [[111]] bla bla bla [[27]] and bla bla bla! [[129]]"; 

$zpreg = preg_match_all('#\[\[(\d{1,3})\]\]#', $text, $matches); 

var_dump($matches[1]); 

$newtext = preg_replace('#\[\[(\d{1,3})\]\]#', getimage($matches[1][?????]), $text); 

echo $newtext; 

Sólo necesito averiguar qué poner dentro getimage() (donde ?? "es") que lo hará poner en la imagen derecha para el derecho [[id]].

Consulte preg_match_all y preg_replace en la documentación oficial para obtener más detalles.

0

la expresión regular, creo, sería:

/\[\[[1-9]{1,3}\]\]/g 

(para un número dígitos 1-a-3 en el interior de los soportes dobles.)

1

Diversos enfoques diferentes se pueden tomar para esto, dependiendo de cómo se va a mostrar ect,

Tome la frase "Hola [34] mundo"

Crear una función simple ejemplo replaceCode ($ cadena)

function replaceCode($string){ 

    $pos = strpos($string, '['); // Find the first occurrence of the bracket 

    if($pos != false){ 

      // If everything is ok take the next 2 numbers from it 

      // Check for a close bracket & remove ] 

      // call another function to replace the number with the image text 

    } 




} 

Si hay más apariciones de corchetes, recursivamente llame a la función nuevamente, pasando el resto de la cadena a la función nuevamente.

Nota: Es posible que sea necesario realizar la validación primero para garantizar que [y] estén correctamente equilibrados.

5

Si usted quiere ser capaz de escribir códigos cortos como esto:

[[function_name_suffix parameter1 parameter2 ...]] 

aquí es una manera más completa, utilizando preg_replace_callback y call_user_func_array para implementar códigos cortos parametrizados.

function shortcodify($string){ 
    return preg_replace_callback('#\[\[(.*?)\]\]#', function ($matches) { 
     $whitespace_explode = explode(" ", $matches[1]); 
     $fnName = 'shortcode_'.array_shift($whitespace_explode); 
     return function_exists($fnName) ? call_user_func_array($fnName,$whitespace_explode) : $matches[0]; 
    }, $string); 
} 

Si se define esta función:

function shortcode_name($firstname="",$lastname=""){ 
    return "<span class='firstname'>".$firstname."</span>&nbsp;<span class='lastname'>".$lastname."</span>"; 
} 

A continuación, esta llamada

print shortcodify("My name is [[name armel larcier]]"); 

seria:

My name is <span class='firstname'>armel</span>&nbsp;<span class='lastname'>larcier</span> 

Esto es sólo algo que ejecutarse mediante este momento en la idea de supertrue.

Cualquier comentario es más que bienvenido.

+0

Oh, bien, pensé que esto funciona en PHP 5.4+ porque tu código no lo hizo t trabajo en el primer intento. Luego descubrí que tienes un error tipográfico en el nombre de tu función. Usted llama a una función shortcodify() pero se define como shortcodifiy() - la "i" hace la diferencia. Corregí esto por ti. – Hexodus

+1

Buena captura. ¡Muchas gracias! –

0

Mi apuesta es PHP's strtr función ...

<?php 
function get_profile_image($image_url){ 
    return "<img src='{$image_url}' height='200px' width='200px' />"; 
} 

$trans = array(
    "[[1]]" => "Vishal", 
    "[[2]]" => "Kumar", 
    "[[3]]" => "Sahu", 
    "[[4]]" => "Web Designer", 
    "[[5]]" => "Draw and Paint", 
    "[[6]]" => ucwords("any programming language"), 
    "[[7]]" => strtoupper("PHP, JAVASCRIPT and HTML"), 
    "[[8]]" => get_profile_image("http://php.net/images/logos/php-logo.svg"), 
    "[[9]]" => "http://php.net/images/logos/php-logo.svg" 
    ); 
$str = <<<HEREDOC_1 
[[8]] 
<pre>My name is [[1]] [[2]] [[3]]. 
I am a [[4]] and I love to [[5]]. 
I don't know [[6]] but I know [[7]] little bit.</pre> 
Here is my profile image <img src='[[9]]' alt='[[1]]-[[2]]-[[3]]-[[4]]' /> 
HEREDOC_1; 
echo strtr($str, $trans); 

su salida se

[http://php.net/images/logos/php-logo.svg] Mi nombre es Vishal Kumar Sahu . Soy un diseñador web y me encanta dibujar y pintar. No sé Cualquier Lenguaje de Programación pero sé PHP, JAVASCRIPT Y HTML poco bit. Aquí está mi imagen de perfil [Vishal-Kumar-Sahu-Web Designer]

Está funcionando bien en 5.6.

+0

La página de documentación de PHP no debería cambiar. Lo agregaré @MegaTron: D –

Cuestiones relacionadas