PHP:检查拉丁脚本中的字符以及空格和数字

PHP: Check for characters in the Latin script plus spaces and numbers

我是正则表达式的新手,我一直在这个问题上兜兜转转。

PHP: Check alphabetic characters from any latin-based language? 提供了出色的正则表达式来检查拉丁脚本中的任何字符,这是我需要的一部分。

^\p{Latin}+$

并在 https://regex101.com/r/I5b2mC/1

提供了一个工作示例

如果我使用

在PHP中使用正则表达式
echo preg_match('/^\p{Latin}+$/', $testString);

$testString只包含拉丁字母,输出将是1。如果有任何非拉丁字母,输出将是 0。太棒了。

要在其中添加数字,我尝试了 ^\p{Latin}+[[:alnum:]]*$,但这允许拉丁脚本中的任何字符 OR 非拉丁字母 数字(不带重音符号的字母——重音符、尖音符、变音符等),因为它等同于 [a-zA-Z0-9].

如果您在拉丁文字中添加任何带有字符的数字,echo preg_match('/^\p{Latin}+[[:alnum:]]*$/', $testString); returns a 0。所有数字 return 也是 0。这可以通过编辑 https://regex101.com/r/I5b2mC/1

中的表达式来确认

如果拉丁脚本中有任何字符,$testString 中有任何数字 and/or 空格,我如何编辑 echo preg_match('/^\p{Latin}+$/', $testString); 中的表达式以输出 1?例如,如果 $testStringCafé ßüs 459,我希望输出 1

至少有两点需要改变:

  • 添加 u 标志以支持 ASCII 以外的字符 (/^\p{Latin}+$/ => /^[\p{Latin}]+$/u)
  • 为字母、数字和空格模式创建字符 class (/^\p{Latin}+$/u => ^[\p{Latin}]+$/u)
  • 然后添加数字和空格模式。如果您需要支持任何 Unicode 数字,请添加 \d。如果您只需要支持 ASCII 数字,请添加 0-9.

因此,您可以使用

preg_match('/^[\p{Latin}\s0-9]+$/u', $testString) // ASCII only digits
preg_match('/^[\p{Latin}\s\d]+$/u', $testString)  // Any digits

此外,带有 u 标志的 \s 将匹配任何 Unicode 空白字符。

更一般地说,可以禁止任何包含非拉丁字母的字符串(无需逐个添加您想要允许的字符或字符组):

$re = '~ ^ (?! .* [^\PL\p{Latin}] ) .+ $ ~mux';

demo

如果您想要包含至少一个拉丁字母的字符串(并且没有来自其他字母表的字母),您可以使用 script run 来构建您的模式:

$re = '~ ^ [^\pL\r\n]* (?= \p{Latin} ) (*sr: .+ ) $ ~mux';

demo

这两种方案可能更加灵活。显然这完全取决于目标。

有关脚本运行的更多信息 here