【问题标题】:using regex for filtering some words in persian in php在php中使用正则表达式过滤波斯语中的一些单词
【发布时间】:2018-06-12 02:03:10
【问题描述】:

我正在编写一个脚本,该脚本将从短信中识别出令人反感的词语。问题在于,有时用户会对单词进行一些更改,使其无法识别。我的代码也必须能够尽可能地识别那些。

首先,我将所有非 alnum 字符替换为空格。

然后: 我写了两个正则表达式模式。 一种从字符串中删除重复字符。 例如:用户写了:seeeeex,它用sex替换它:

preg_replace('/(.)\1+/', '$1', $text)

这个正则表达式适用于英语单词,但不适用于波斯语单词,这是我的情况。 例如,如果你写: امیییییییییین 它与它无关。 我也试过了

mb_ereg_replace

但它也不起作用。

我的另一个正则表达式是删除所有单字母单词周围的空格。 例如:我希望它把 S E X 转换为性:

preg_replace('/( [a-zA-Zآ-ی] )\1+/', trim('$1'), $text);

这个正则表达式根本不起作用,需要更正。

感谢您的帮助

【问题讨论】:

  • 我怀疑应该是preg_repalce 而不是str_replace
  • @revo 对,问这个问题是个错误,在我的代码中我使用的是 preg
  • 尝试使用Unicode标志u => /(.)\1+/u

标签: php regex unicode


【解决方案1】:

使用多字节字符时,您应该启用 Unicode Aware 修饰符来更改标记的行为以匹配正确的内容。在您的第一种情况下,它应该是:

/(.)\1+/u

但是,在您的第二个正则表达式中,我看到了语法和语义错误,您可以将其更改为:

/\b(\pL)\s+/u

PHP:

preg_replace('/\b(\pL)\s+/u', '$1', $text);

综合起来:

$text = 'سسس ککک سسس';
echo preg_replace(['/(.)\1+/u', '/\b(\pL)\s+/u'], '$1', $text); // خروجی میدهد: سکس

Live demo

【讨论】:

  • 谢谢,太好了,还有一件事,在第二个正则表达式中,单词的最后一个字母周围有空格,附加到下一个单词,就像这句话:منخیلیس ک س را دوست دارم 替换后变为 'من خیلی سکسرا دوست دارم'。我该如何解决这个问题?
  • 一个简单的解决方法是将\b(\pL)\s+更改为\b(\pL)\s+(?!\S{2})
  • 我收到这个错误:错误:分隔符不能是字母数字或反斜杠
  • 别忘了加上分隔符。
猜你喜欢
  • 1970-01-01
  • 2017-01-04
  • 1970-01-01
  • 2013-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-16
相关资源
最近更新 更多