【问题标题】:How to remove special/accented characters and words with digits?如何删除特殊/重音字符和带数字的单词?
【发布时间】:2015-03-17 07:18:50
【问题描述】:

我正在尝试创建蛞蝓。我的字符串是这样的:$string='möbel#*-jérôme-mp3-how?';

步骤:1

首先,我想从这个字符串中删除特殊字符、非字母数字和非拉丁字符。

像这样:$string='möbel-jérôme-mp3-how';

以前,我的字符串中只有英文字符。

所以,我以前是这样做的:$string = preg_replace("([^a-z0-9])", "-", $string);

但是,由于我也想保留外来字符,所以这是行不通的。

步骤:2

然后,我想删除所有包含一个或多个数字的单词。

在这个示例字符串中,我想删除单词 mp3,因为它包含一个或多个数字。

所以,最终的字符串如下所示:$string='möbel-jérôme-how';

我以前是这样的:

$words = explode('-',$string);
$result = array();

foreach($words as $word) 
{
if( ($word ==preg_replace("([^a-z])", "-", $word)) && strlen($word)>2)  
$result[]=$word;
}
$string = implode(' ',$result);

这现在不起作用,因为它包含外来字符。

【问题讨论】:

标签: php regex


【解决方案1】:

在 PHP 中,您可以访问 Unicode 属性:

$result = preg_replace('/[^\p{L}\p{N}-]+/u', '', $subject);

将为您完成第 1 步。 (\p{L} 匹配任何 Unicode 字母,\p{N} 匹配任何 Unicode 数字)。

删除带数字的单词同样简单:

$result2 = preg_replace('/\b\w*\d\w*\b-?/', '', $result);

\b 匹配单词的开头和结尾)。

【讨论】:

  • 最后一个例子适用于像a2c4这样的一般字符串,但它也会从价格中删除数字,比如$100变成$,或者$25.25变成$.,如果您只想删除带数字的单词,这有点出乎意料。
【解决方案2】:

如果您实际上是在为链接做 slug,我强烈建议您音译 unicode 字符。您可以使用PHP's iconv 来实现。


类似问题here。我认为获得最高票数的答案的独创性和简单性很棒:)

【讨论】:

    【解决方案3】:

    我建议分多个步骤进行:

    1. 创建一串允许的字符(所有字符),然后只保留它们来遍历字符串。 (这需要一些时间,但这是一次性的)

    2. - 上做一个分解并检查所有单词并只保留那些不包含数字的单词。然后再次内爆。

    我相信,从现在开始你可以自己编写脚本了。

    【讨论】:

    • 感谢您的回复。但是,创建一个允许的字符列表可能会很困难,因为它会太多。
    猜你喜欢
    • 2012-05-30
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 2018-11-29
    • 1970-01-01
    • 1970-01-01
    • 2020-02-29
    • 2023-03-03
    相关资源
    最近更新 更多