PHP正则表达式:匹配字符集或字符串结尾

PHP正则表达式:匹配字符集或字符串结尾,php,regex,Php,Regex,我正在将代码从Nodejs移植到PHP,并不断发现此正则表达式的错误: ^/[a-z0-9]{6}([^0-9a-z]|$) PHP抱怨美元符号: 未知修饰符“$” 在javascript中,我能够检查字符串是否以[^0-9a-z]或字符串结尾 如何在PHP中使用preg_match实现这一点 我的PHP代码如下所示: <? $sExpression = '^/[a-z0-9]{6}([^0-9a-z]|$)'; if (preg_match('|' . $sExpression . '

我正在将代码从Nodejs移植到PHP,并不断发现此正则表达式的错误:

^/[a-z0-9]{6}([^0-9a-z]|$)

PHP抱怨美元符号:

未知修饰符“$”

在javascript中,我能够检查字符串是否以
[^0-9a-z]
字符串结尾
如何在PHP中使用preg_match实现这一点

我的PHP代码如下所示:

<?
$sExpression = '^/[a-z0-9]{6}([^0-9a-z]|$)';
if (preg_match('|' . $sExpression .  '|', $sUrl)) { ... }
?>

提前谢谢。

你能先修好注册表吗

^/[a-z0-9]{6}([^0-9a-z]|$) 
试试这个

更新:正如其他人指出的那样,我和我并没有将a/视为\。。哈哈

好吧,我们再来一次

我会避免使用“|”,只是这样做

if (preg_match('/^\/[a-z0-9]{6}([^0-9a-z]|$)/', $sUrl)) { ... }

要匹配以斜杠开头,后跟6个字母数字,然后后跟字符串结尾或非字母数字的字符串,请执行以下操作:

preg_match('~^/[a-z0-9]{6}([^0-9a-z]|$)~i', $str);
最初的JavaScript可能使用了
new RegExp()
,但PCRE需要适当的表达式封装;这些是我在上面代码中输入的
~
字符。顺便说一句,我使用
I
修饰符使表达式不区分大小写;如果不需要,请随意移除

更新 您使用的是
|
作为附件;因此,您应该转义表达式中的管道字符,但这样做会改变其含义。通常最好选择在表达式中没有特殊含义的分隔符;它还有助于选择表达式中不出现的分隔符,例如,我选择的
~
避免了转义任何字符

PCRE中的表达式可概括为:

填充修饰符

通常,起始定界符与结束定界符相同,但诸如
[expression]i
{expression}i
之类的情况除外,其中开始大括号与结束大括号匹配:)

将其简化为仅匹配特定字符或字符串结尾(php)

这将匹配

xxx777xxx or xxx777 but not xxx7777 or xxx7777xxx

$
在正则表达式中有特殊含义。你必须回避这个问题。我正在尝试将“文本结尾”与$匹配,然后他将不得不将其放在组外。你使用的php函数是什么,例如preg_match,preg_match_all,你确实有这个错误“/[“literal”[“not character group.^/[a-z0-9]{6}([^0-9a-z].$)最初的JavaScript代码是什么?真的,你认为这是一个有效的regx吗?我也不知道
^/
是如何有效的。上次我检查它是
/^
。因此,{6}暗示了一个字符组没有开头括号是很好的语法?shoot.lol@me疲倦,我看到了/as\但他仍然需要逃避surly@zerkms-我会把这归咎于诵读困难症,但现在的问题是他的定界符是什么。他最终更新了他的问题,说明了是什么导致了所有这些混乱。结果证明,
/
并不是用来定界符的。杰克,哟如果你是对的,我应该展示完整的代码——我使用的是“|”字符作为分隔符。所以,我想这不是问题所在。请看我在问题中的编辑。是的,这是问题所在,因为分隔符
也是表达式的一部分,这就是为什么它认为
$
是一个标志,因为它就在
@LexPodgorny之后。嗯,是的,表达式本身很好(我认为).你完全正确。将
|
更改为
~
修复了它。感谢您花时间解释!
\D777(\D|$)\
xxx777xxx or xxx777 but not xxx7777 or xxx7777xxx