【问题标题】:strip out all strange characters of string去掉字符串的所有奇怪字符
【发布时间】:2011-05-11 17:42:09
【问题描述】:

我正在尝试创建一个蛞蝓,所以我想去掉每个奇怪的角色。 slug 应该包含的唯一内容是小写字母和下划线。有没有办法检查奇怪的字符并将其过滤掉字符串?所有不是字符或下划线的都应该删除

这就是我所拥有的:

if(!preg_match_all('/[a-z]/')):
    $output = preg_replace("/ ... euhm ... /", "", $slug2);
else:
    $output = $slug2;
endif;

我应该从这个开始:创建一个 3D 丝带环绕效果(加上免费的 PSD!)

对此:create_a_3d_ribbon_wrap_around_effect_plus_a_free_psd

【问题讨论】:

标签: php regex preg-match


【解决方案1】:
$slug = strtolower($slug);
$slug = str_replace(" ", "_", $slug);
$slug = preg_replace("/[^a-z0-9_]/", "", $slug);

【讨论】:

  • 除了那些古色古香的 1960sish a-z 之外,恐怕你已经忘记了 1882 个小写字母。 ˋunichars -a '\p{Lower}' '[^a-z]' | wc -lˋ == 1882
  • 基于 OP 的示例,这看起来将用于 URL 中的 slugs。并且 Unicode 字符在 URL 中看起来 ugly,所以我怀疑 OP 想要保留它们。
  • 同意。但有趣的事实是,不仅仅是拉丁语、西里尔语和希腊语。 ;)
【解决方案2】:

不需要初始匹配。您可以进行无条件的搜索和替换。如果没有什么可以替换的,没什么大不了的。这是一个大的函数调用链:

$slug = trim(preg_replace('/[\W_]+/', '_', strtolower($slug)), '_');

或者拆分成单独的行:

$slug = strlower($slug);
$slug = preg_replace('/[\W_]+/', '_', $slug);
$slug = trim($slug, '_');

解释:

  1. 使用strtolower将大写转换为小写。
  2. 搜索\W_。 “单词”字符是字母、数字或下划线。 “非单词”字符与之相反,即空格、标点符号和控制字符。 \W 匹配“非单词”字符。
  3. 用下划线替换那些坏字符。如果连续不止一个,它们都将被一个下划线替换。
  4. 从字符串的开头和结尾剪掉下划线。

代码比较复杂,因为它需要处理几个棘手的情况:

  • 末尾的坏字符需要删除,而不是转换为下划线。例如,您的示例中的 !)
  • 我们希望foo_-_bar 变成foo_bar,而不是foo___bar。基本上,下划线应该被折叠起来。

【讨论】:

    【解决方案3】:
    $slug = preg_replace("[^a-z_]", "", $slug);
    

    【讨论】:

    • 你忘记了将近两千个小写字母。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2021-04-23
    • 2021-12-13
    • 2014-08-18
    • 1970-01-01
    • 2019-11-20
    • 1970-01-01
    相关资源
    最近更新 更多