获取重音 preg_match_all 语法 PHP

3

我有一个 preg_match_all 函数来获取标签:

  preg_match_all('/(^|[^a-z0-9_])#([a-z0-9_]+)/ui', $text, $matchedHashtags);

这个程序效果良好,但是如果遇到一些重音符号就会停止运行:

#hash //works
#hash_hash //works
#hash_não // get just $hash_n

我需要改变什么?

2个回答

3

您可以使用Unicode类别Letter


正则表达式:

/(?<![\p{L}0-9_])#([\p{L}0-9_]+)/u

regex101演示

  • Another option is to simply include the accented characters in the character class:

    /(?<![a-zãàÀèÈìÌ0-9_])#([a-zãàÀèÈìÌ0-9_]+)/ui
    

[编辑]


关于\p令牌

在设置/u标志时支持Unicode。有一些替代方案来匹配字母,使用以下类别或脚本:

1. \p{Latin} 拉丁文脚本

2. \p{L&} 无大小写字母

3. \p{L} 所有字母

4. \p{Xan} 任何字母数字字符

  • 匹配: \p{L}\p{N} 数字(来自任意脚本)。
  • 代码点数:18,843(18,057 + 786)

5. \p{Xwd} 任何Perl“单词”字符

  • 匹配: \p{Xan} 和下划线。
  • 代码点数:18,844

1
使用\p{Latin}来缩小字符集到拉丁字母,或者只返回翻译后的文本。 - Casimir et Hippolyte
@PaulCrovella 你可能在指 Unicode 等效的“分解形式”,在那里你可以匹配 组合字符,比如\p{Mn}。我不认为这是在这种情况下适用的。 - Mariano
@PaulCrovella 这是真的。你说得对。 - Mariano

1

try with:

(^|\w)#(\w+)

demo

具有u、g和m模式


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接