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

时间:2014-07-08 05:15:52

标签: php regex

我正在将代码从Nodejs移植到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)) { ... }
?>

JS代码与此类似:

var sExpression = '^/[a-z0-9]{6}([^0-9a-z]|$)';
var oRegex      = new RegExp(sExpression);
if (oRegex.test(sUrl)) { ... }

提前致谢。

3 个答案:

答案 0 :(得分:5)

匹配以斜杠开头的字符串,后跟6个字母数字,然后是字符串结尾或不是字母数字的字符串:

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之类的情况,其中左括号与右括号匹配:)

答案 1 :(得分:0)

你可以先修复regx吗?

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

试试这个

更新:正如其他人指出我和idot并且看到一个/作为一个\ ..大声笑

好的,再次去看看,

我要避免使用“|”并且就这样做。

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

答案 2 :(得分:0)

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

\D777(\D|$)\

这将匹配

xxx777xxx or xxx777 but not xxx7777 or xxx7777xxx