使用正则表达式过滤PHP中的波斯语中的一些单词

时间:2018-01-02 10:59:06

标签: php regex unicode

我正在编写一个脚本,用于识别短信中的冒犯性词语。问题在于,有时用户会对单词进行一些更改并使其无法识别。我的代码必须能够尽可能地识别它们。

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

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

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

这个正则表达式适用于英语单词,但不适用于我的情况下的波斯语单词。 例如,如果你写: امیییییییییین 它没有任何作用。 我也试过

mb_ereg_replace

但它也没有用。

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

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

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

感谢您的帮助

1 个答案:

答案 0 :(得分:3)

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

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

然而,在你的第二个正则表达式中,我看到了语法和语义错误,你可以将它改为:

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

PHP:

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

全部放在一起:

{{Form::hidden('_method', 'POST')}}

<强> Live demo