【问题标题】:Trying To Find Forward Slash In Preg_Match尝试在 Preg_Match 中查找正斜杠
【发布时间】:2012-09-02 20:16:23
【问题描述】:

我一直在寻找几个小时试图找到解决方案。我正在尝试确定 REQUEST URI 是否合法并从那里分解。

$samplerequesturi = "/variable/12345678910";

判断是否合法,第一段variable只有字母,长度可变。第二部分是数字,总共应该有 11 个。我的问题是转义正斜杠,以便在 uri 中匹配。我试过了:

preg_match("/^[\/]{1}[a-z][\/]{1}[0-9]{11}+$/", $samplerequesturi)
preg_match("/^[\\/]{1}[a-z][\\/]{1}[0-9]{11}+$/", $samplerequesturi)
preg_match("/^#/#{1}[a-z]#/#{1}[0-9]{11}+$/", $samplerequesturi)
preg_match("/^|/|{1}[a-z]|/|{1}[0-9]{11}+$/", $samplerequesturi)

还有一些我现在不记得了。

请求通常会出错:

preg_match(): Unknown modifier '|' 
preg_match(): Unknown modifier '#'
preg_match(): Unknown modifier '['

编辑: 我想我应该声明 REQUEST URI 是已知的。我试图证明整个字符串以确保它不是伪造的字符串,即确保第一组只有小写字母,第二组只有 11 个数字。

【问题讨论】:

  • 您应该将字符串按/ 拆分并分别对每个部分执行验证。
  • 您还可以使用/ 以外的分隔符来避免转义。例如preg_match("!^abc.*$!" 也可以。

标签: php preg-match


【解决方案1】:

/ 不是唯一可以用作分隔符的东西。事实上,您几乎可以使用任何非字母数字字符。我个人喜欢使用(),因为它提醒我结果数组的第一项是整个匹配项,它也不需要在模式中转义。

preg_match("(^/([a-z]+)/(\d+)$)i",$samplerequesturi,$out);
var_dump($out);

应该可以的。

【讨论】:

    【解决方案2】:

    如果您想使用正则表达式(在这种情况下我认为没有必要,只需拆分“/”就可以了:

    $samplerequesturi = "/variable/12345678910";
    preg_match("@^/([A-Za-z]+)/(\d+)$@", $samplerequesturi, $out);
    echo $out[1];
    echo $out[2];
    

    应该让你去

    【讨论】:

    • echo $out[1]; & echo $out[2]; 都产生Array
    • 尝试使用 preg_match 而不是 preg_match_all。
    【解决方案3】:

    您的问题可能是您使用/ 正斜杠作为正则表达式分隔符(在正则表达式的开头和结尾)。切换到使用正斜杠以外的字符,例如 # 哈希符号或任何其他永远不需要出现在此特定表达式中的符号。那么你就不需要在表达式中转义正斜杠字符了。

    【讨论】:

    • 我尝试了哈希,但仍然找不到匹配项。 preg_match("#^[/]{1}[a-z][/]{1}[0-9]+$#"
    • 你不需要将单个字符包裹在字符集括号中,如果它只有一个你也不需要指定数量,所以[/]{1}可以简单地替换为/ .而且您忘记在您的[a-z] 后面加上+(匹配多个)。所以试试"#^/([a-z]+)/([0-9]+)$#" 看看是否可行。
    猜你喜欢
    • 2012-08-18
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    • 2021-01-01
    • 1970-01-01
    • 2013-11-04
    相关资源
    最近更新 更多