【问题标题】:creating regex with letters and accents创建带有字母和重音符号的正则表达式
【发布时间】:2018-08-02 16:38:42
【问题描述】:

我需要创建一个匹配单词空格单词的正则表达式,它不能以空格开头,单词和单词之间也没有超过 1 个空格我必须在每个单词上允许字母和重音符号,我正在使用这种模式:

^([^\+\*\.\|\(\)\[\]\{\}\?\/\^\s\d\t\n\r<>ºª!@"·#~½%¬&=\'¿¡~´,;:_®¥§¹×£µ€¶«²¢³\$\-\\]+\s{0,1}?)*$/

示例:

-Graça+whitespace+anotherWord            -> match
-whitespace+Graça+whitespace+anotherWord -> don't match
-Graça+whitespace+whitespace+anotherword -> don't match

一般来说,允许 firstname+whitespace+lastname 带有重音字符和 a-z 字符是一种验证

我必须排除所有特殊字符,例如 /*-+)(!/($=

【问题讨论】:

  • 你能举一些你想匹配或不匹配的字符串的例子吗?
  • 那么失败的测试输入是什么?你只是想让它更简单吗?
  • 当然,我想匹配如下内容:示例: 1.) Graça somethingelse ->match 2.) (whitespace)Graça somethingelse ->not match 一般:名字+姓氏,这两个词之间只有一个空格
  • 请使用示例输入编辑您的问题。
  • 仅作记录,您在该巨大字符集中拥有的所有字符实际上都不需要转义,除了[\- 被逐字解释,只要它出现在集合的第一个或最后一个字符)。 {0,1}? 也可以简单地写成??

标签: php regex


【解决方案1】:

你可以试试这个模式:^[\x{0041}-\x{02B3}]+\s[\x{0041}-\x{02B3}]+

说明:由于您使用的字符与\w 不匹配,因此您必须定义自己的单词字符范围。 \x{0041} 只是一个 unicode 索引等于 0041 的字符。

Demo

【讨论】:

  • 此正则表达式允许许多非字母字符:[、\、]、^、_、`、{、|、}、~、删除 (U+007F)、控制字符 (U+0080 –U+009F)、不间断空格 (U+00A0)、£、½、¿、×、÷ 以及许多其他。此外,它允许一些间距修饰符字母,例如 ʰ 和 ʳ,但不允许其余的,例如 ʴ 或 ʷ。
  • 是的,我看到了,但是关于定义我自己的单词字符范围的评论对我帮助很大,我终于使它适用于这种模式:^([\x{0041}-\x{ 005A}\x{0061}-\x{007A}\x{00C0}-\x{00F6}\x{00F8}-\x{024F}]+\s??)*$/u
【解决方案2】:

对于空格,使用 str_replace

$string = str_replace(' ', '', $string);

对于所有空格,使用 preg_replace

$string = preg_replace('/\s+/', '', $string);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-19
    • 2011-09-23
    • 1970-01-01
    • 2013-04-02
    • 1970-01-01
    • 2013-10-25
    • 1970-01-01
    相关资源
    最近更新 更多