【问题标题】:Regular expression - preg_match Latin and Greek characters [duplicate]正则表达式 - preg_match 拉丁语和希腊语字符 [重复]
【发布时间】:2013-04-17 15:56:15
【问题描述】:

我正在尝试为任何给定的字符串创建一个正则表达式。

目标:删除所有不是“latin”或“小写希腊语”或“数字”的字符”。

到目前为止我做了什么:[^a-z0-9]
这非常适合拉丁字符。

当我尝试这个时:[^a-z0-9α-ω] 不走运。有效,但省略了任何其他符号,如 !!#$%@%#$@,`

我对正则表达式的了解有限。任何帮助将非常感激!

编辑:
下面发布的是匹配指定字符并从中创建一个 slug 的函数,用破折号作为分隔符:

        $q_separator = preg_quote('-');
        $trans = array(
            '&.+?;'                 => '',
            '[^a-z0-9 -]'           => '',
            '\s+'                   => $separator,
            '('.$q_separator.')+'   => $separator
        );

        $str = strip_tags($str);

        foreach ($trans as $key => $val){
            $str = preg_replace("#".$key."#i", $val, $str);
        }

        if ($lowercase === TRUE){
            $str = strtolower($str);
        }

        return trim($str, '-');  

如果字符串是:OnCE on a tIME !#% @$$ in MEXIco
使用该函数,输出将是:once-on-a-time-in-mexico

这很好用,但我希望 preg_match 也排除 greek 字符。

【问题讨论】:

  • 每个操作系统的 preg_match 重复问题?
  • 他有一个很好的解决方案..

标签: php regex preg-replace preg-match


【解决方案1】:

好的,这可以代替您的功能吗?

$subject = 'OnCEΨΩ é-+@àupon</span> aαθ tIME !#%@$ in MEXIco in the year 1874 <or 1875';

function format($str, $excludeRE = '/[^a-z0-9]+/u', $separator = '-') {
    $str = strip_tags($str);
    $str = strtolower($str);
    $str = preg_replace($excludeRE, $separator, $str);
    $str = trim($str, $separator);
    return $str;
}
echo format($subject);

请注意,您将丢失 &lt; 之后的所有字符(由于 strip_tags),直到遇到 &gt;


// 我认为你想保留希腊字符时的旧答案

可以建立一个字符范围,如α-ω或任何你想要的奇怪字符!您的模式不起作用的原因是您没有通知正则表达式引擎您正在处理一个 unicode 字符串。为此,您必须在模式末尾添加 u 修饰符。像这样:

/[^a-z0-9α-ω]+/u

您也可以使用 chars 十六进制代码:

/[^a-z0-9\x{3B1}-\x{3C9}]+/u 

请注意,如果您确定没有或不想在字符串中保留大写希腊字符,您可以像这样使用字符类\p{Greek}

/[^a-z0-9\p{Greek}]+/u

(有点长但更明确)

【讨论】:

  • 第一个解决方案有效,但符号仍然存在 第二个解决方案错误:编译失败:\x{...} 序列中的字符值在偏移量 15 处太大 第三个解决方案有效,但符号仍然存在
  • 用一些代码更新了我的问题
  • 好的,现在更清楚了
  • 您的函数适用于 $excludeRE = '/[^a-z0-9α-ω]++/u'。我需要先测试每个案例。
【解决方案2】:

关于这个问题已经有答案了:

Remove Non English Characters PHP

您不能指定范围,例如 α-ω,但您需要使用它们的代码,例如\00-\255

【讨论】:

  • 在哪里可以找到希腊字符的代码。或者组合字符范围或类似的东西
猜你喜欢
  • 2020-10-16
  • 2011-01-30
  • 1970-01-01
  • 2011-08-20
  • 1970-01-01
  • 2013-04-08
  • 2021-09-18
  • 1970-01-01
  • 2016-12-28
相关资源
最近更新 更多