1

我正在尝试创建蛞蝓。我的字符串是这样的:$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);

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

4

3 回答 3

2

在 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匹配单词的开头和结尾)。

于 2012-11-30T13:27:26.263 回答
2

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


类似的问题在这里。我认为,票数最高的答案的独创性和简单性很棒:)

于 2012-11-30T13:36:32.643 回答
0

我建议分多个步骤执行此操作:

  1. 创建一串允许的字符(全部),并通过仅保留它们来遍历字符串。(这需要一些时间,但这是一次性的)

  2. 做一个爆炸-并浏览所有的单词,只保留那些不包含数字的单词。然后再次内爆。

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

于 2012-11-30T13:26:25.070 回答