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
?例如,如果 $testString
是 Café ßü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';
如果您想要包含至少一个拉丁字母的字符串(并且没有来自其他字母表的字母),您可以使用 script run 来构建您的模式:
$re = '~ ^ [^\pL\r\n]* (?= \p{Latin} ) (*sr: .+ ) $ ~mux';
这两种方案可能更加灵活。显然这完全取决于目标。
有关脚本运行的更多信息 here。
我是正则表达式的新手,我一直在这个问题上兜兜转转。
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
?例如,如果 $testString
是 Café ßü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';
如果您想要包含至少一个拉丁字母的字符串(并且没有来自其他字母表的字母),您可以使用 script run 来构建您的模式:
$re = '~ ^ [^\pL\r\n]* (?= \p{Latin} ) (*sr: .+ ) $ ~mux';
这两种方案可能更加灵活。显然这完全取决于目标。
有关脚本运行的更多信息 here。