Saludos señores!
Tengo un problema con mi PHP. Estoy intentando en que mi blog genere urls amistosas para buscadores a traves de los títulos de los posts, pero por más que pruebo alternativas no consigo que funcione. Encontre una entrada en este foro bastante interesante sobre el tema que me ocupa, pero con las propuestas que daban en esa entrada tampoco me funcionó. Dado que no soy programador es muy probable que esté haciendo algo mal o que la solución sea más sencilla de lo que, a priori, me parece.
Os pongo a continuación el contenido del fichero que me genera las urls en mi PHP:
<?php
if (!defined('BASE_URL')) {
exit ('No direct script access allowed');
}
/**
* Create a friendly URL
*
* @param string $str URL which need to be transform
*
* @function friendlyURL
* @access public
* @return string
*/
public static function friendlyURL($str)
{
$delimiter = '-';
$clean = iconv('UTF-8', 'ASCII//TRANSLIT', $str);
$clean = preg_replace("/[^a-zA-Z0-9\/_|+ -]/", '', $clean);
$clean = strtolower(trim($clean, '-'));
$clean = preg_replace("/[\/_|+ -]+/", $delimiter, $clean);
return $clean;
}
/**
* All characters in the string after the last _, if these numbers will be deleted
*
* @param string $string string which need to be transform
*
* @function slugURL
* @access public
* @return string
*/
public static function slugURL($string)
{
$url = explode('-', $string);
if (is_numeric(end($url))) {
end($url);
unset($url[key($url)]);
}
return self::friendlyURL(implode('-', $url));
}
/**
* Clean all spaces before and after the comma
*
* @param string $string string which need to be transform
*
* @function prepareTags
* @access public
* @return string
*/
public static function prepareTags($string)
{
return implode(",", preg_split('~,\s*~', trim($string)));
}
/**
* One-way string hashing
*
* @param string $string string which need to be hash
*
* @function hashPassword
* @access public
* @return hashed string
*/
public static function hashPassword($string)
{
global $_EBLOG_hash;
/**
* Remove all malicious code (better known as XSS)
*
* @param string $dirty_html string that need to be clean
*
* @function cleanXSS
* access public
* @return string
*/
public static function cleanXSS($dirty_html)
{
include_once 'public/vendor/htmlpurifier/htmlpurifier.standalone.php';
$config = HTMLPurifier_Config::createDefault();
$purifier = new HTMLPurifier($config);
return $purifier->purify($dirty_html);
}
/**
* Check if an array is empty
*
* @param array $array array which need to be check
*
* @function isEmptyArray
* @access public
* @return true for empty or false otherwise
*/
public static function isEmptyArray($array)
{
if (array_filter($_FILES['image']['name']) === array()) {
return true;
}
return false;
}
/**
* Remove all characters up to the first _ including this
*
* @param string $imageName name of image
*
* @function altOfImage
* @access public
* @return string
*/
public static function altOfImage($imageName)
{
$name = explode('_', pathinfo($imageName, PATHINFO_FILENAME));
unset($name[0]);
return implode(' ', $name);
}
Saludos Miquel! Gracias por tu atención
He implementado el código pero o el sistema crashea o, por contra, no le afecta en absoluto. Me explico. Al reemplazar la función concreta de mi código por tu aporte, no hay ningún cambio sobre las stopwords que citas ni sobre las palabras con acentos.
La idea es que se eliminien esas stop words y se sustituyan los carácter con acentos por carácteres sin acentos.
Adjunto el archivo .php en cuestión para facilitaros su visionado y tal vez así podamos solucionar el problema más fácilmente: http://ge.tt/5Nlo6e72/v/0?c
acabo de probar en local con mamp y me falla la función iconv, la variable $clean queda en blanco, seguramente es porqué al php le falte instalar la librería iconv
$clean = iconv('UTF-8', 'ASCII//TRANSLIT', $str);
el mismo código en el servidor de producción (ubuntu server) funciona bien, de echo lo puedes ver con las urls del foro por ejemplo
Pues podría ser eso que dices de la librería porque por otros foros por más que probamos a hacer cambios en el código que aquí te muestro no se aprecia ningún cambio o, por contra, el código deja de funcionar y la página web crashea con error 404.
De ser lo de las librerías ¿dónde podría encontrarlas para instalarlas en el directorio de mi php?.
Bueno, después de tiempo investigando he sacado esto:
public static function friendlyURL($str)
{
setlocale(LC_ALL,'es_ES.UTF8');
$delimiter = '-';
$clean = iconv('UTF-8', 'ASCII//TRANSLIT', $str);
$clean = preg_replace("/[^a-zA-Z0-9\/_|+ -]/", '', $clean);
$clean = strtolower(trim($clean, '-'));
$clean = preg_replace("/[\/_|+ -]+/", $delimiter, $clean);
return $clean;
}
con esta pequeña variación consigo que los acentos y símbolos raros desaparezcan pero no las letras a las que acompañan (suposición--->suposicion). Pero aún no se como hacer para quitar las stopwords como artículos y preposiciones. ¿Alguna idea? Ya he probado unas cuantas soluciones pero ninguna funciona.
Tengo un problema con mi PHP. Estoy intentando en que mi blog genere urls amistosas para buscadores a traves de los títulos de los posts, pero por más que pruebo alternativas no consigo que funcione. Encontre una entrada en este foro bastante interesante sobre el tema que me ocupa, pero con las propuestas que daban en esa entrada tampoco me funcionó. Dado que no soy programador es muy probable que esté haciendo algo mal o que la solución sea más sencilla de lo que, a priori, me parece.
Os pongo a continuación el contenido del fichero que me genera las urls en mi PHP:
<?php
if (!defined('BASE_URL')) {
exit ('No direct script access allowed');
}
/**
*--------------------------------------------------------------------------
* === CLASS SOLUTIISOFT ===
*--------------------------------------------------------------------------
* Collection of static methods helpful
*
* PHP version 5.3
*
* @category E-Blog
* @package Core
* @subpackage Libraries
* @filename solutiisoft.php
* @author Solutii Soft <office@solutiisoft.ro>
* @copyright 2013 Solutii Soft
* @license 2013 Solutii Soft
* @link http://www.eblog.solutiisoft.com
* @since File available since Release 1.0
*/
class Solutii_Soft
{
/**
* Create a friendly URL
*
* @param string $str URL which need to be transform
*
* @function friendlyURL
* @access public
* @return string
*/
public static function friendlyURL($str)
{
$delimiter = '-';
$clean = iconv('UTF-8', 'ASCII//TRANSLIT', $str);
$clean = preg_replace("/[^a-zA-Z0-9\/_|+ -]/", '', $clean);
$clean = strtolower(trim($clean, '-'));
$clean = preg_replace("/[\/_|+ -]+/", $delimiter, $clean);
return $clean;
}
/**
* All characters in the string after the last _, if these numbers will be deleted
*
* @param string $string string which need to be transform
*
* @function slugURL
* @access public
* @return string
*/
public static function slugURL($string)
{
$url = explode('-', $string);
if (is_numeric(end($url))) {
end($url);
unset($url[key($url)]);
}
return self::friendlyURL(implode('-', $url));
}
/**
* Clean all spaces before and after the comma
*
* @param string $string string which need to be transform
*
* @function prepareTags
* @access public
* @return string
*/
public static function prepareTags($string)
{
return implode(",", preg_split('~,\s*~', trim($string)));
}
/**
* One-way string hashing
*
* @param string $string string which need to be hash
*
* @function hashPassword
* @access public
* @return hashed string
*/
public static function hashPassword($string)
{
global $_EBLOG_hash;
$salt = $_EBLOG_hash['salt'];
$strength = "12";
if (CRYPT_BLOWFISH == 1) {
$presalt = (version_compare(PHP_VERSION, '5.3.7', '<')) ? '2a' : '2y';
$blowfish_salt = '$'. $presalt .'$' . $strength . '$'. substr($salt, 0, CRYPT_SALT_LENGTH) .'$';
return crypt($string, $blowfish_salt);
}
return sha1(hash_hmac('sha512', $salt, $string));
}
/**
* Remove all malicious code (better known as XSS)
*
* @param string $dirty_html string that need to be clean
*
* @function cleanXSS
* access public
* @return string
*/
public static function cleanXSS($dirty_html)
{
include_once 'public/vendor/htmlpurifier/htmlpurifier.standalone.php';
$config = HTMLPurifier_Config::createDefault();
$purifier = new HTMLPurifier($config);
return $purifier->purify($dirty_html);
}
/**
* Check if an array is empty
*
* @param array $array array which need to be check
*
* @function isEmptyArray
* @access public
* @return true for empty or false otherwise
*/
public static function isEmptyArray($array)
{
if (array_filter($_FILES['image']['name']) === array()) {
return true;
}
return false;
}
/**
* Remove all characters up to the first _ including this
*
* @param string $imageName name of image
*
* @function altOfImage
* @access public
* @return string
*/
public static function altOfImage($imageName)
{
$name = explode('_', pathinfo($imageName, PATHINFO_FILENAME));
unset($name[0]);
return implode(' ', $name);
}
}
/* end of file solutiisoft.php */
28/12/2014 04:23
aquí te dejo la función que usamos en betabeers
https://gist.github.com/miquelcamps/39cfb9b76457aaf277a8
saludos
29/12/2014 15:24
He implementado el código pero o el sistema crashea o, por contra, no le afecta en absoluto. Me explico. Al reemplazar la función concreta de mi código por tu aporte, no hay ningún cambio sobre las stopwords que citas ni sobre las palabras con acentos.
La idea es que se eliminien esas stop words y se sustituyan los carácter con acentos por carácteres sin acentos.
Adjunto el archivo .php en cuestión para facilitaros su visionado y tal vez así podamos solucionar el problema más fácilmente: http://ge.tt/5Nlo6e72/v/0?c
29/12/2014 17:08
acabo de probar en local con mamp y me falla la función iconv, la variable $clean queda en blanco, seguramente es porqué al php le falte instalar la librería iconv
$clean = iconv('UTF-8', 'ASCII//TRANSLIT', $str);
el mismo código en el servidor de producción (ubuntu server) funciona bien, de echo lo puedes ver con las urls del foro por ejemplo
30/12/2014 16:41
De ser lo de las librerías ¿dónde podría encontrarlas para instalarlas en el directorio de mi php?.
30/12/2014 17:12
por si te ayuda aquí tienes más info
https://docs.moodle.org/25/en/admin/environment/php_extension/iconv
20/01/2015 03:36
public static function friendlyURL($str)
{
setlocale(LC_ALL,'es_ES.UTF8');
$delimiter = '-';
$clean = iconv('UTF-8', 'ASCII//TRANSLIT', $str);
$clean = preg_replace("/[^a-zA-Z0-9\/_|+ -]/", '', $clean);
$clean = strtolower(trim($clean, '-'));
$clean = preg_replace("/[\/_|+ -]+/", $delimiter, $clean);
return $clean;
}
con esta pequeña variación consigo que los acentos y símbolos raros desaparezcan pero no las letras a las que acompañan (suposición--->suposicion). Pero aún no se como hacer para quitar las stopwords como artículos y preposiciones. ¿Alguna idea? Ya he probado unas cuantas soluciones pero ninguna funciona.