我正在将代码从Node.js移植到PHP,并不断得到这个正则表达式的错误:
^/[a-z0-9]{6}([^0-9a-z]|$)
PHP抱怨$符号:
未知修饰符"$"
在JavaScript中,我能够检查字符串是否以[^0-9a-z]
或END OF STRING
结束。如何在PHP中使用preg_match()?
我的PHP代码是这样的:
<?
$sExpression = '^/[a-z0-9]{6}([^0-9a-z]|$)';
if (preg_match('|' . $sExpression . '|', $sUrl)) {
// ...
}
?>
JavaScript代码类似如下:
var sExpression = '^/[a-z0-9]{6}([^0-9a-z]|$)';
var oRegex = new RegExp(sExpression);
if (oRegex.test(sUrl)) {
// ...
}
匹配以斜杠开头,后跟六个字母数字,然后后跟字符串结束符或非字母数字的字符串:
preg_match('~^/[a-z0-9]{6}([^0-9a-z]|$)~i', $str);
最初的JavaScript可能使用了new RegExp(<expression>)
,但PCRE需要对表达式进行适当的封装;这些是我放在上面代码中的~
字符。顺便说一句,我通过使用i
修饰符使表达式不区分大小写;如果不需要,请随意删除。
您使用|
作为外壳;因此,您应该转义表达式内的管道字符,但是这样做会改变其含义。通常最好选择在表达式中没有特殊含义的分隔符;它还有助于选择在表达式中不出现的分隔符,例如,我选择~
避免了必须转义任何字符。
PCRE中的表达式可以概括为:
<start-delimiter> stuff <end-delimiter> modifiers
通常,开始分隔符与结束分隔符相同,除了[expression]i
或{expression}i
等情况,其中开始大括号与结束大括号匹配:)
先修复正则表达式:
^/[a-z0-9]{6}([^0-9a-z]|$)
试试这个。
正如其他人指出的那样,我是个白痴,把/
看作'
…LOL .
好,我们再来一次,
我会避免使用"|"就这样做。
if (preg_match('/^'/[a-z0-9]{6}([^0-9a-z]|$)/', $sUrl)) { ... }
将其简化为仅匹配特定字符或字符串结束(PHP),
'D777('D|$)'
这将匹配:
xxx777xxx or xxx777 but not xxx7777 or xxx7777xxx