PHP正则表达式:匹配字符集或字符串结尾
我正在将代码从Nodejs移植到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 . '
^/[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