php - 将字符串转换为网络安全 URI

标签 php

我想要转换带有特殊字符的字符串。通常我会手动找到所有特殊字符及其“网络安全”对应部分并将它们放入数组中。然后我使用 preg_replace 替换每个字符。

但我不禁想到有一个更简单的解决方案,因为它是错误修剪方法。

这是我想要的一个例子:

Hans Günther -> hans-gunther
Jären höst   -> jaeren-hoest
René Ågesen  -> rene-aagesen

最佳答案

字符串 urlencode (字符串 $str)

http://php.net/manual/en/function.urlencode.php

实际上,这是一篇很棒的文章,关于将上面示例中的文本转换为漂亮的 url 安全字符串(可能比上面的函数更适合你):

http://cubiq.org/the-perfect-php-clean-url-generator

setlocale(LC_ALL, 'en_US.UTF8');
function toAscii($str, $replace=array(), $delimiter='-') {
 if( !empty($replace) ) {
  $str = str_replace((array)$replace, ' ', $str);
 }

 $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;
}

以下是它的作用示例:

echo toAscii("Mess'd up --text-- just (to) stress /test/ ?our! `little` \\clean\\ url fun.ction!?-->");
returns: messd-up-text-just-to-stress-test-our-little-clean-url-function

echo toAscii("Perché l'erba è verde?", "'"); // Italian
returns: perche-l-erba-e-verde

echo toAscii("Peux-tu m'aider s'il te plaît?", "'"); // French
returns: peux-tu-m-aider-s-il-te-plait

echo toAscii("Tänk efter nu – förr'n vi föser dig bort"); // Swedish
returns: tank-efter-nu-forrn-vi-foser-dig-bort

echo toAscii("ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöùúûüýÿ");
returns: aaaaaaaeceeeeiiiidnooooouuuuyssaaaaaaaeceeeeiiiidnooooouuuuyy

echo toAscii("Custom`delimiter*example", array('*', '`'));
returns: custom-delimiter-example

echo toAscii("My+Last_Crazy|delimiter/example", '', ' ');
returns: my last crazy delimiter example

如果您想将 ä 转换为 ae 等,您可以使用这样的脚本(抱歉,不知道有什么更好的方法):

setlocale(LC_ALL, 'de_DE');
$replace = array(
 'illegal' => array('/Ä/', '/Ö/', '/Ü/', '/ä/', '/ö/', '/ü/', '/Â/', '/é/'),
 'legal' => array('Ae', 'Oe', 'Ue', 'ae', 'oe', 'ue', 'Aa', 'e')
 );
$string = 'ich hätte gerne brötechen Mein Name ist Öles Âlex';
echo preg_replace($replace['illegal'], $replace['legal'], $string);

//Output: "ich haette gerne broetechen Mein Name ist Oeles Aalex"

您显然可以像这样将它们放在一起(仅转换 ü->ue 等,只需在第一个 preg_replace 中添加更多内容):

setlocale(LC_ALL, 'en_US.UTF8');
function toAscii($str, $replace=array(), $delimiter='-') {
    if( !empty($replace) ) {
        $str = str_replace((array)$replace, ' ', $str);
    }

 $clean = preg_replace(array('/Ä/', '/Ö/', '/Ü/', '/ä/', '/ö/', '/ü/'), array('Ae', 'Oe', 'Ue', 'ae', 'oe', 'ue'), $str);
    $clean = iconv('UTF-8', 'ASCII//TRANSLIT', $clean);
    $clean = preg_replace("/[^a-zA-Z0-9\/_|+ -]/", '', $clean);
    $clean = strtolower(trim($clean, '-'));
    $clean = preg_replace("/[\/_|+ -]+/", $delimiter, $clean);

    return $clean;
}

$text = "Hätten Sie gerne viele Brötchen? Wenn ja dann einfach *!@#$%^&*()eingeben...";
echo toAscii($text);
//OUTPUT: haetten-sie-gerne-viele-broetchen-wenn-ja-dann-einfach-eingeben

关于php - 将字符串转换为网络安全 URI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4783802/

相关文章:

PHP错误: Notice: Undefined index: January in

php - 如何在mysql查询中创建自定义列的值

php - 在 Doctrine 中使用设置为 NULL 的唯一 ID 创建的实体对象

php - 元素形式 : Must be non-empty 上属性操作的错误值

php - 在 PHP 中使用 explode 函数并使用 for 循环插入数据库

php - Jquery 函数只执行第一项

php - 使用 PHP 从数据库中提取值并将结果作为变量传递给 JavaScript

javascript - 使用 codeigniter 搜索栏中的自动完成功能

php - 购物车更新后 WooCommerce 购物车数量不会改变

php - 使用 ZF 使 Zend_Rest_Server 返回 JSON 而不是 XML